chore: merge develop
This commit is contained in:
commit
4dd1442e9d
|
|
@ -0,0 +1,67 @@
|
|||
name: Tests
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
test-contracts:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
submodules: recursive
|
||||
|
||||
- name: Install Foundry
|
||||
uses: foundry-rs/foundry-toolchain@v1
|
||||
with:
|
||||
version: nightly
|
||||
|
||||
- name: Install Dependencies
|
||||
run: yarn --ignore-scripts
|
||||
|
||||
- name: Audit
|
||||
run: yarn audit --groups dependencies
|
||||
|
||||
- name: Compile
|
||||
run: yarn compile
|
||||
|
||||
- name: Run Test
|
||||
run: yarn test
|
||||
|
||||
test-ui:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ui
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
- name: Install Dependencies
|
||||
run: yarn --ignore-scripts
|
||||
|
||||
- name: Audit
|
||||
run: yarn audit --groups dependencies
|
||||
|
||||
- name: Build
|
||||
run: yarn build
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"*.{js,json,sol,ts}": "prettier --write"
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npx lint-staged --config .husky/lint-staged.config.json
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
yarn test
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
{
|
||||
"files": "*.sol",
|
||||
"options": {
|
||||
"printWidth": 80,
|
||||
"printWidth": 120,
|
||||
"tabWidth": 4,
|
||||
"singleQuote": false,
|
||||
"bracketSpacing": false
|
||||
|
|
|
|||
|
|
@ -1,60 +1,45 @@
|
|||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.7;
|
||||
|
||||
import "@openzeppelin/contracts/access/AccessControl.sol";
|
||||
|
||||
abstract contract FleekAccessControl is AccessControl {
|
||||
bytes32 public constant COLLECTION_OWNER_ROLE =
|
||||
keccak256("COLLECTION_OWNER_ROLE");
|
||||
bytes32 public constant COLLECTION_CONTROLLER_ROLE =
|
||||
keccak256("COLLECTION_CONTROLLER_ROLE");
|
||||
|
||||
constructor() {
|
||||
_setRoleAdmin(COLLECTION_OWNER_ROLE, DEFAULT_ADMIN_ROLE);
|
||||
_grantRole(COLLECTION_OWNER_ROLE, msg.sender);
|
||||
}
|
||||
|
||||
modifier requireCollectionOwner() {
|
||||
require(
|
||||
hasRole(COLLECTION_OWNER_ROLE, msg.sender),
|
||||
"FleekAccessControl: must have collection owner role"
|
||||
);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier requireCollectionController() {
|
||||
require(
|
||||
hasRole(COLLECTION_OWNER_ROLE, msg.sender) ||
|
||||
hasRole(COLLECTION_CONTROLLER_ROLE, msg.sender),
|
||||
"FleekAccessControl: must have collection controller role"
|
||||
);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier requireTokenController(uint256 tokenId) {
|
||||
require(
|
||||
hasRole(_tokenRole(tokenId, "CONTROLLER"), msg.sender),
|
||||
"FleekAccessControl: must have token role"
|
||||
);
|
||||
_;
|
||||
}
|
||||
|
||||
function isTokenController(
|
||||
uint256 tokenId,
|
||||
address account
|
||||
) public view returns (bool) {
|
||||
return hasRole(_tokenRole(tokenId, "CONTROLLER"), account);
|
||||
}
|
||||
|
||||
function _tokenRole(
|
||||
uint256 tokenId,
|
||||
string memory role
|
||||
) internal pure returns (bytes32) {
|
||||
return keccak256(abi.encodePacked("TOKEN_", role, tokenId));
|
||||
}
|
||||
|
||||
function _clearTokenControllers(uint256 tokenId) internal {
|
||||
// TODO: Remove token controllers from AccessControl
|
||||
}
|
||||
}
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity ^0.8.7;
|
||||
|
||||
import "@openzeppelin/contracts/access/AccessControl.sol";
|
||||
|
||||
abstract contract FleekAccessControl is AccessControl {
|
||||
bytes32 public constant COLLECTION_OWNER_ROLE = keccak256("COLLECTION_OWNER_ROLE");
|
||||
bytes32 public constant COLLECTION_CONTROLLER_ROLE = keccak256("COLLECTION_CONTROLLER_ROLE");
|
||||
|
||||
constructor() {
|
||||
_setRoleAdmin(COLLECTION_OWNER_ROLE, DEFAULT_ADMIN_ROLE);
|
||||
_grantRole(COLLECTION_OWNER_ROLE, msg.sender);
|
||||
}
|
||||
|
||||
modifier requireCollectionOwner() {
|
||||
require(hasRole(COLLECTION_OWNER_ROLE, msg.sender), "FleekAccessControl: must have collection owner role");
|
||||
_;
|
||||
}
|
||||
|
||||
modifier requireCollectionController() {
|
||||
require(
|
||||
hasRole(COLLECTION_OWNER_ROLE, msg.sender) || hasRole(COLLECTION_CONTROLLER_ROLE, msg.sender),
|
||||
"FleekAccessControl: must have collection controller role"
|
||||
);
|
||||
_;
|
||||
}
|
||||
|
||||
modifier requireTokenController(uint256 tokenId) {
|
||||
require(hasRole(_tokenRole(tokenId, "CONTROLLER"), msg.sender), "FleekAccessControl: must have token role");
|
||||
_;
|
||||
}
|
||||
|
||||
function isTokenController(uint256 tokenId, address account) public view returns (bool) {
|
||||
return hasRole(_tokenRole(tokenId, "CONTROLLER"), account);
|
||||
}
|
||||
|
||||
function _tokenRole(uint256 tokenId, string memory role) internal pure returns (bytes32) {
|
||||
return keccak256(abi.encodePacked("TOKEN_", role, tokenId));
|
||||
}
|
||||
|
||||
function _clearTokenControllers(uint256 tokenId) internal {
|
||||
// TODO: Remove token controllers from AccessControl
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,16 +41,10 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
Counters.Counter private _tokenIds;
|
||||
mapping(uint256 => App) private _apps;
|
||||
|
||||
constructor(
|
||||
string memory _name,
|
||||
string memory _symbol
|
||||
) ERC721(_name, _symbol) {}
|
||||
constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}
|
||||
|
||||
modifier requireTokenOwner(uint256 tokenId) {
|
||||
require(
|
||||
msg.sender == ownerOf(tokenId),
|
||||
"FleekERC721: must be token owner"
|
||||
);
|
||||
require(msg.sender == ownerOf(tokenId), "FleekERC721: must be token owner");
|
||||
_;
|
||||
}
|
||||
|
||||
|
|
@ -92,7 +86,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
return tokenId;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Returns the token metadata associated with the `tokenId`.
|
||||
*
|
||||
* Returns a based64 encoded string value of the URI.
|
||||
|
|
@ -102,13 +96,12 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
* - the tokenId must be minted and valid.
|
||||
*
|
||||
*/
|
||||
function tokenURI(
|
||||
uint256 tokenId
|
||||
) public view virtual override returns (string memory) {
|
||||
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
|
||||
_requireMinted(tokenId);
|
||||
address owner = ownerOf(tokenId);
|
||||
App storage app = _apps[tokenId];
|
||||
|
||||
// prettier-ignore
|
||||
bytes memory dataURI = abi.encodePacked(
|
||||
'{',
|
||||
'"name":"', app.name, '",',
|
||||
|
|
@ -128,7 +121,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
return string(abi.encodePacked(_baseURI(), Base64.encode((dataURI))));
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Adds a new address with the`tokenController` privileges to a previously minted `tokenId`.
|
||||
*
|
||||
* May emit a {RoleGranted} event.
|
||||
|
|
@ -139,15 +132,12 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
* - the sender must have the `tokenOwner` role.
|
||||
*
|
||||
*/
|
||||
function addTokenController(
|
||||
uint256 tokenId,
|
||||
address controller
|
||||
) public requireTokenOwner(tokenId) {
|
||||
function addTokenController(uint256 tokenId, address controller) public requireTokenOwner(tokenId) {
|
||||
_requireMinted(tokenId);
|
||||
_grantRole(_tokenRole(tokenId, "CONTROLLER"), controller);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Strips an address from their `tokenController` privileges on a previously minted `tokenId`.
|
||||
*
|
||||
* May emit a {RoleRevoked} event.
|
||||
|
|
@ -158,10 +148,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
* - the sender must have the `tokenOwner` role.
|
||||
*
|
||||
*/
|
||||
function removeTokenController(
|
||||
uint256 tokenId,
|
||||
address controller
|
||||
) public requireTokenOwner(tokenId) {
|
||||
function removeTokenController(uint256 tokenId, address controller) public requireTokenOwner(tokenId) {
|
||||
_requireMinted(tokenId);
|
||||
_revokeRole(_tokenRole(tokenId, "CONTROLLER"), controller);
|
||||
}
|
||||
|
|
@ -169,9 +156,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
/**
|
||||
* @dev See {IERC165-supportsInterface}.
|
||||
*/
|
||||
function supportsInterface(
|
||||
bytes4 interfaceId
|
||||
) public view virtual override(ERC721, AccessControl) returns (bool) {
|
||||
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, AccessControl) returns (bool) {
|
||||
return super.supportsInterface(interfaceId);
|
||||
}
|
||||
|
||||
|
|
@ -207,7 +192,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
return "data:application/json;base64,";
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Updates the `externalURL` metadata field of a minted `tokenId`.
|
||||
*
|
||||
* May emit a {NewTokenExternalURL} event.
|
||||
|
|
@ -227,7 +212,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
emit NewTokenExternalURL(tokenId, _tokenExternalURL, msg.sender);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Updates the `ENS` metadata field of a minted `tokenId`.
|
||||
*
|
||||
* May emit a {NewTokenENS} event.
|
||||
|
|
@ -238,16 +223,13 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
* - the sender must have the `tokenController` role.
|
||||
*
|
||||
*/
|
||||
function setTokenENS(
|
||||
uint256 tokenId,
|
||||
string memory _tokenENS
|
||||
) public virtual requireTokenController(tokenId) {
|
||||
function setTokenENS(uint256 tokenId, string memory _tokenENS) public virtual requireTokenController(tokenId) {
|
||||
_requireMinted(tokenId);
|
||||
_apps[tokenId].ENS = _tokenENS;
|
||||
emit NewTokenENS(tokenId, _tokenENS, msg.sender);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Updates the `name` metadata field of a minted `tokenId`.
|
||||
*
|
||||
* May emit a {NewTokenName} event.
|
||||
|
|
@ -258,16 +240,13 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
* - the sender must have the `tokenController` role.
|
||||
*
|
||||
*/
|
||||
function setTokenName(
|
||||
uint256 tokenId,
|
||||
string memory _tokenName
|
||||
) public virtual requireTokenController(tokenId) {
|
||||
function setTokenName(uint256 tokenId, string memory _tokenName) public virtual requireTokenController(tokenId) {
|
||||
_requireMinted(tokenId);
|
||||
_apps[tokenId].name = _tokenName;
|
||||
emit NewTokenName(tokenId, _tokenName, msg.sender);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Updates the `description` metadata field of a minted `tokenId`.
|
||||
*
|
||||
* May emit a {NewTokenDescription} event.
|
||||
|
|
@ -287,7 +266,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
emit NewTokenDescription(tokenId, _tokenDescription, msg.sender);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Updates the `image` metadata field of a minted `tokenId`.
|
||||
*
|
||||
* May emit a {NewTokenImage} event.
|
||||
|
|
@ -298,16 +277,13 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
* - the sender must have the `tokenController` role.
|
||||
*
|
||||
*/
|
||||
function setTokenImage(
|
||||
uint256 tokenId,
|
||||
string memory _tokenImage
|
||||
) public virtual requireTokenController(tokenId) {
|
||||
function setTokenImage(uint256 tokenId, string memory _tokenImage) public virtual requireTokenController(tokenId) {
|
||||
_requireMinted(tokenId);
|
||||
_apps[tokenId].image = _tokenImage;
|
||||
emit NewTokenImage(tokenId, _tokenImage, msg.sender);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Adds a new build to a minted `tokenId`'s builds mapping.
|
||||
*
|
||||
* May emit a {NewBuild} event.
|
||||
|
|
@ -324,14 +300,11 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
string memory _gitRepository
|
||||
) public virtual requireTokenController(tokenId) {
|
||||
_requireMinted(tokenId);
|
||||
_apps[tokenId].builds[++_apps[tokenId].currentBuild] = Build(
|
||||
_commitHash,
|
||||
_gitRepository
|
||||
);
|
||||
_apps[tokenId].builds[++_apps[tokenId].currentBuild] = Build(_commitHash, _gitRepository);
|
||||
emit NewBuild(tokenId, _commitHash, msg.sender);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* @dev Burns a previously minted `tokenId`.
|
||||
*
|
||||
* May emit a {Transfer} event.
|
||||
|
|
@ -342,9 +315,7 @@ contract FleekERC721 is ERC721, FleekAccessControl {
|
|||
* - the sender must have the `tokenOwner` role.
|
||||
*
|
||||
*/
|
||||
function burn(
|
||||
uint256 tokenId
|
||||
) public virtual requireTokenOwner(tokenId) {
|
||||
function burn(uint256 tokenId) public virtual requireTokenOwner(tokenId) {
|
||||
super._burn(tokenId);
|
||||
|
||||
if (bytes(_apps[tokenId].externalURL).length != 0) {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -68,13 +68,11 @@
|
|||
"storageLayout",
|
||||
"evm.gasEstimates"
|
||||
],
|
||||
"": [
|
||||
"ast"
|
||||
]
|
||||
"": ["ast"]
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"useLiteralContent": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
12
package.json
12
package.json
|
|
@ -3,15 +3,19 @@
|
|||
"version": "0.0.1",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"private": "false",
|
||||
"scripts": {
|
||||
"test": "hardhat test && forge test --via-ir",
|
||||
"test:foundry": "forge test --via-ir",
|
||||
"test:hardhat": "hardhat test",
|
||||
"format": "prettier --write \"./**/*.{js,ts,sol}\"",
|
||||
"format": "prettier --write \"./**/*.{js,json,sol,ts}\"",
|
||||
"node:hardhat": "hardhat node --tags local",
|
||||
"deploy:local": "hardhat deploy --tags local",
|
||||
"deploy:mumbai": "hardhat deploy --tags mumbai --network mumbai",
|
||||
"compile": "hardhat compile"
|
||||
"compile": "hardhat compile",
|
||||
"postinstall": "husky install",
|
||||
"prepack": "pinst --disable",
|
||||
"postpack": "pinst --enable"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
@ -39,7 +43,9 @@
|
|||
"hardhat-contract-sizer": "^2.6.1",
|
||||
"hardhat-deploy": "^0.11.15",
|
||||
"hardhat-gas-reporter": "^1.0.9",
|
||||
"minimist": "^1.2.7",
|
||||
"husky": "^8.0.2",
|
||||
"lint-staged": "^13.0.4",
|
||||
"pinst": "^3.0.0",
|
||||
"prettier": "^2.7.1",
|
||||
"prettier-plugin-solidity": "^1.0.0",
|
||||
"solidity-coverage": "^0.8.2",
|
||||
|
|
|
|||
|
|
@ -1,23 +1,23 @@
|
|||
// npx hardhat run scripts/mint.js --network mumbai
|
||||
const { getContract } = require('./util');
|
||||
|
||||
// TODO: make this arguments
|
||||
const params = [
|
||||
'0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049', // to
|
||||
'Fleek App', // name
|
||||
'Description', // description
|
||||
'https://fleek.network/fleek-network-logo-minimal.png', // image
|
||||
'https://fleek.co/', // external url
|
||||
'fleek.eth', // ens
|
||||
'6ea6ad16c46ae85faced7e50555ff7368422f57', // commit hash
|
||||
'https://github.com/org/repo', // repo
|
||||
'fleek', // author
|
||||
];
|
||||
|
||||
(async () => {
|
||||
const contract = getContract('FleekERC721');
|
||||
|
||||
const transaction = await contract.mint(...params);
|
||||
|
||||
console.log('Response: ', transaction);
|
||||
})();
|
||||
// npx hardhat run scripts/mint.js --network mumbai
|
||||
const { getContract } = require('./util');
|
||||
|
||||
// TODO: make this arguments
|
||||
const params = [
|
||||
'0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049', // to
|
||||
'Fleek App', // name
|
||||
'Description', // description
|
||||
'https://fleek.network/fleek-network-logo-minimal.png', // image
|
||||
'https://fleek.co/', // external url
|
||||
'fleek.eth', // ens
|
||||
'6ea6ad16c46ae85faced7e50555ff7368422f57', // commit hash
|
||||
'https://github.com/org/repo', // repo
|
||||
'fleek', // author
|
||||
];
|
||||
|
||||
(async () => {
|
||||
const contract = getContract('FleekERC721');
|
||||
|
||||
const transaction = await contract.mint(...params);
|
||||
|
||||
console.log('Response: ', transaction);
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
// npx hardhat run scripts/tokenURI.js --network mumbai
|
||||
const { getContract } = require('./util');
|
||||
|
||||
// TODO: make this arguments
|
||||
const tokenId = 1;
|
||||
|
||||
(async () => {
|
||||
const contract = await getContract('FleekERC721');
|
||||
|
||||
const transaction = await contract.tokenURI(tokenId);
|
||||
|
||||
const parsed = JSON.parse(
|
||||
Buffer.from(transaction.slice(29), 'base64').toString('utf-8')
|
||||
);
|
||||
|
||||
console.log('Response: ', parsed);
|
||||
})();
|
||||
// npx hardhat run scripts/tokenURI.js --network mumbai
|
||||
const { getContract } = require('./util');
|
||||
|
||||
// TODO: make this arguments
|
||||
const tokenId = 1;
|
||||
|
||||
(async () => {
|
||||
const contract = await getContract('FleekERC721');
|
||||
|
||||
const transaction = await contract.tokenURI(tokenId);
|
||||
|
||||
const parsed = JSON.parse(
|
||||
Buffer.from(transaction.slice(29), 'base64').toString('utf-8')
|
||||
);
|
||||
|
||||
console.log('Response: ', parsed);
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,18 +1,18 @@
|
|||
// npx hardhat run scripts/upgrade.js --network mumbai
|
||||
const { getContract } = require('./util');
|
||||
|
||||
// TODO: make this arguments
|
||||
const params = [
|
||||
1, // tokenId
|
||||
'97e7908f70f0862d753c66689ff09e70caa43df2', // commit hash
|
||||
'https://github.com/org/new-repo', // repo
|
||||
'new-author', // author
|
||||
];
|
||||
|
||||
(async () => {
|
||||
const contract = await getContract('FleekERC721');
|
||||
|
||||
const transaction = await contract.setTokenBuild(...params);
|
||||
|
||||
console.log('Response: ', transaction);
|
||||
})();
|
||||
// npx hardhat run scripts/upgrade.js --network mumbai
|
||||
const { getContract } = require('./util');
|
||||
|
||||
// TODO: make this arguments
|
||||
const params = [
|
||||
1, // tokenId
|
||||
'97e7908f70f0862d753c66689ff09e70caa43df2', // commit hash
|
||||
'https://github.com/org/new-repo', // repo
|
||||
'new-author', // author
|
||||
];
|
||||
|
||||
(async () => {
|
||||
const contract = await getContract('FleekERC721');
|
||||
|
||||
const transaction = await contract.setTokenBuild(...params);
|
||||
|
||||
console.log('Response: ', transaction);
|
||||
})();
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
module.exports.getContract = async function (contractName) {
|
||||
const {
|
||||
address,
|
||||
} = require(`../deployments/${hre.network.name}/${contractName}.json`);
|
||||
|
||||
return hre.ethers.getContractAt(contractName, address);
|
||||
};
|
||||
module.exports.getContract = async function (contractName) {
|
||||
const {
|
||||
address,
|
||||
} = require(`../deployments/${hre.network.name}/${contractName}.json`);
|
||||
|
||||
return hre.ethers.getContractAt(contractName, address);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,175 +1,167 @@
|
|||
import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
|
||||
import { expect } from 'chai';
|
||||
import { ethers } from 'hardhat';
|
||||
import web3 from 'web3';
|
||||
|
||||
describe('FleekERC721', () => {
|
||||
const COLLECTION_OWNER_ROLE = web3.utils.keccak256('COLLECTION_OWNER_ROLE');
|
||||
|
||||
const MINT_PARAMS = Object.freeze({
|
||||
name: 'Fleek Test App',
|
||||
description: 'Fleek Test App Description',
|
||||
image: 'https://fleek.co/image.png',
|
||||
ens: 'fleek.eth',
|
||||
externalUrl: 'https://fleek.co',
|
||||
commitHash: 'b72e47171746b6a9e29b801af9cb655ecf4d665c',
|
||||
gitRepository: 'https://github.com/fleekxyz/contracts',
|
||||
author: 'author',
|
||||
});
|
||||
|
||||
const COLLECTION_PARAMS = Object.freeze({
|
||||
name: 'FleekERC721',
|
||||
symbol: 'FLEEK',
|
||||
});
|
||||
|
||||
const defaultFixture = async () => {
|
||||
// Contracts are deployed using the first signer/account by default
|
||||
const [owner, otherAccount] = await ethers.getSigners();
|
||||
|
||||
const Contract = await ethers.getContractFactory('FleekERC721');
|
||||
const contract = await Contract.deploy(
|
||||
COLLECTION_PARAMS.name,
|
||||
COLLECTION_PARAMS.symbol
|
||||
);
|
||||
|
||||
return { owner, otherAccount, contract };
|
||||
};
|
||||
|
||||
describe('Deployment', () => {
|
||||
it('should assign the name and the symbol of the ERC721 contract', async () => {
|
||||
const { contract } = await loadFixture(defaultFixture);
|
||||
|
||||
expect(await contract.name()).to.equal(COLLECTION_PARAMS.name);
|
||||
expect(await contract.symbol()).to.equal(COLLECTION_PARAMS.symbol);
|
||||
});
|
||||
|
||||
it('should assign the owner of the contract', async () => {
|
||||
const { owner, contract } = await loadFixture(defaultFixture);
|
||||
|
||||
expect(
|
||||
await contract.hasRole(COLLECTION_OWNER_ROLE, owner.address)
|
||||
).to.equal(true);
|
||||
});
|
||||
|
||||
it('should support ERC721 interface', async () => {
|
||||
const { contract } = await loadFixture(defaultFixture);
|
||||
|
||||
expect(await contract.supportsInterface('0x80ac58cd')).to.equal(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Minting', () => {
|
||||
it('should be able to mint a new token', async () => {
|
||||
const { owner, contract } = await loadFixture(defaultFixture);
|
||||
|
||||
const response = await contract.mint(
|
||||
owner.address,
|
||||
MINT_PARAMS.name,
|
||||
MINT_PARAMS.description,
|
||||
MINT_PARAMS.image,
|
||||
MINT_PARAMS.externalUrl,
|
||||
MINT_PARAMS.ens,
|
||||
MINT_PARAMS.commitHash,
|
||||
MINT_PARAMS.gitRepository,
|
||||
MINT_PARAMS.author
|
||||
);
|
||||
|
||||
expect(response.value).to.be.instanceOf(ethers.BigNumber);
|
||||
expect(response.value.toNumber()).to.equal(0);
|
||||
});
|
||||
|
||||
it('should not be able to mint a new token if not the owner', async () => {
|
||||
const { otherAccount, contract } = await loadFixture(defaultFixture);
|
||||
|
||||
await expect(
|
||||
contract
|
||||
.connect(otherAccount)
|
||||
.mint(
|
||||
otherAccount.address,
|
||||
MINT_PARAMS.name,
|
||||
MINT_PARAMS.description,
|
||||
MINT_PARAMS.image,
|
||||
MINT_PARAMS.externalUrl,
|
||||
MINT_PARAMS.ens,
|
||||
MINT_PARAMS.commitHash,
|
||||
MINT_PARAMS.gitRepository,
|
||||
MINT_PARAMS.author
|
||||
)
|
||||
).to.be.revertedWith(
|
||||
'FleekAccessControl: must have collection owner role'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Token', () => {
|
||||
let tokenId: number;
|
||||
let fixture: Awaited<ReturnType<typeof defaultFixture>>;
|
||||
|
||||
before(async () => {
|
||||
fixture = await loadFixture(defaultFixture);
|
||||
const { contract } = fixture;
|
||||
|
||||
const response = await contract.mint(
|
||||
fixture.owner.address,
|
||||
MINT_PARAMS.name,
|
||||
MINT_PARAMS.description,
|
||||
MINT_PARAMS.image,
|
||||
MINT_PARAMS.externalUrl,
|
||||
MINT_PARAMS.ens,
|
||||
MINT_PARAMS.commitHash,
|
||||
MINT_PARAMS.gitRepository,
|
||||
MINT_PARAMS.author
|
||||
);
|
||||
|
||||
tokenId = response.value.toNumber();
|
||||
});
|
||||
|
||||
it('should return the token URI', async () => {
|
||||
const { contract } = fixture;
|
||||
const tokenURI = await contract.tokenURI(tokenId);
|
||||
|
||||
const tokenURIDecoded = Buffer.from(
|
||||
tokenURI.replace('data:application/json;base64,', ''),
|
||||
'base64'
|
||||
).toString('ascii');
|
||||
|
||||
const parsedURI = JSON.parse(tokenURIDecoded);
|
||||
|
||||
expect(parsedURI).to.eql({
|
||||
owner: fixture.owner.address.toLowerCase(),
|
||||
name: MINT_PARAMS.name,
|
||||
description: MINT_PARAMS.description,
|
||||
image: MINT_PARAMS.image,
|
||||
external_url: MINT_PARAMS.externalUrl,
|
||||
attributes: [
|
||||
{
|
||||
trait_type: 'ENS',
|
||||
value: MINT_PARAMS.ens,
|
||||
},
|
||||
{
|
||||
trait_type: 'Commit Hash',
|
||||
value: MINT_PARAMS.commitHash,
|
||||
},
|
||||
{
|
||||
trait_type: 'Repository',
|
||||
value: MINT_PARAMS.gitRepository,
|
||||
},
|
||||
{
|
||||
trait_type: 'Author',
|
||||
value: MINT_PARAMS.author,
|
||||
},
|
||||
{
|
||||
trait_type: 'Version',
|
||||
value: '0',
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it('should match the token owner', async () => {
|
||||
const { contract, owner } = fixture;
|
||||
const tokenOwner = await contract.ownerOf(tokenId);
|
||||
expect(tokenOwner).to.equal(owner.address);
|
||||
});
|
||||
});
|
||||
});
|
||||
import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
|
||||
import { expect } from 'chai';
|
||||
import { ethers } from 'hardhat';
|
||||
import web3 from 'web3';
|
||||
|
||||
describe('FleekERC721', () => {
|
||||
const COLLECTION_OWNER_ROLE = web3.utils.keccak256('COLLECTION_OWNER_ROLE');
|
||||
|
||||
const MINT_PARAMS = Object.freeze({
|
||||
name: 'Fleek Test App',
|
||||
description: 'Fleek Test App Description',
|
||||
image: 'https://fleek.co/image.png',
|
||||
ens: 'fleek.eth',
|
||||
externalUrl: 'https://fleek.co',
|
||||
commitHash: 'b72e47171746b6a9e29b801af9cb655ecf4d665c',
|
||||
gitRepository: 'https://github.com/fleekxyz/contracts',
|
||||
});
|
||||
|
||||
const COLLECTION_PARAMS = Object.freeze({
|
||||
name: 'FleekERC721',
|
||||
symbol: 'FLEEK',
|
||||
});
|
||||
|
||||
const defaultFixture = async () => {
|
||||
// Contracts are deployed using the first signer/account by default
|
||||
const [owner, otherAccount] = await ethers.getSigners();
|
||||
|
||||
const Contract = await ethers.getContractFactory('FleekERC721');
|
||||
const contract = await Contract.deploy(
|
||||
COLLECTION_PARAMS.name,
|
||||
COLLECTION_PARAMS.symbol
|
||||
);
|
||||
|
||||
return { owner, otherAccount, contract };
|
||||
};
|
||||
|
||||
describe('Deployment', () => {
|
||||
it('should assign the name and the symbol of the ERC721 contract', async () => {
|
||||
const { contract } = await loadFixture(defaultFixture);
|
||||
|
||||
expect(await contract.name()).to.equal(COLLECTION_PARAMS.name);
|
||||
expect(await contract.symbol()).to.equal(COLLECTION_PARAMS.symbol);
|
||||
});
|
||||
|
||||
it('should assign the owner of the contract', async () => {
|
||||
const { owner, contract } = await loadFixture(defaultFixture);
|
||||
|
||||
expect(
|
||||
await contract.hasRole(COLLECTION_OWNER_ROLE, owner.address)
|
||||
).to.equal(true);
|
||||
});
|
||||
|
||||
it('should support ERC721 interface', async () => {
|
||||
const { contract } = await loadFixture(defaultFixture);
|
||||
|
||||
expect(await contract.supportsInterface('0x80ac58cd')).to.equal(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Minting', () => {
|
||||
it('should be able to mint a new token', async () => {
|
||||
const { owner, contract } = await loadFixture(defaultFixture);
|
||||
|
||||
const response = await contract.mint(
|
||||
owner.address,
|
||||
MINT_PARAMS.name,
|
||||
MINT_PARAMS.description,
|
||||
MINT_PARAMS.image,
|
||||
MINT_PARAMS.externalUrl,
|
||||
MINT_PARAMS.ens,
|
||||
MINT_PARAMS.commitHash,
|
||||
MINT_PARAMS.gitRepository
|
||||
);
|
||||
|
||||
expect(response.value).to.be.instanceOf(ethers.BigNumber);
|
||||
expect(response.value.toNumber()).to.equal(0);
|
||||
});
|
||||
|
||||
it('should not be able to mint a new token if not the owner', async () => {
|
||||
const { otherAccount, contract } = await loadFixture(defaultFixture);
|
||||
|
||||
await expect(
|
||||
contract
|
||||
.connect(otherAccount)
|
||||
.mint(
|
||||
otherAccount.address,
|
||||
MINT_PARAMS.name,
|
||||
MINT_PARAMS.description,
|
||||
MINT_PARAMS.image,
|
||||
MINT_PARAMS.externalUrl,
|
||||
MINT_PARAMS.ens,
|
||||
MINT_PARAMS.commitHash,
|
||||
MINT_PARAMS.gitRepository
|
||||
)
|
||||
).to.be.revertedWith(
|
||||
'FleekAccessControl: must have collection owner role'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Token', () => {
|
||||
let tokenId: number;
|
||||
let fixture: Awaited<ReturnType<typeof defaultFixture>>;
|
||||
|
||||
before(async () => {
|
||||
fixture = await loadFixture(defaultFixture);
|
||||
const { contract } = fixture;
|
||||
|
||||
const response = await contract.mint(
|
||||
fixture.owner.address,
|
||||
MINT_PARAMS.name,
|
||||
MINT_PARAMS.description,
|
||||
MINT_PARAMS.image,
|
||||
MINT_PARAMS.externalUrl,
|
||||
MINT_PARAMS.ens,
|
||||
MINT_PARAMS.commitHash,
|
||||
MINT_PARAMS.gitRepository
|
||||
);
|
||||
|
||||
tokenId = response.value.toNumber();
|
||||
});
|
||||
|
||||
it('should return the token URI', async () => {
|
||||
const { contract } = fixture;
|
||||
const tokenURI = await contract.tokenURI(tokenId);
|
||||
|
||||
const tokenURIDecoded = Buffer.from(
|
||||
tokenURI.replace('data:application/json;base64,', ''),
|
||||
'base64'
|
||||
).toString('ascii');
|
||||
|
||||
const parsedURI = JSON.parse(tokenURIDecoded);
|
||||
|
||||
expect(parsedURI).to.eql({
|
||||
owner: fixture.owner.address.toLowerCase(),
|
||||
name: MINT_PARAMS.name,
|
||||
description: MINT_PARAMS.description,
|
||||
image: MINT_PARAMS.image,
|
||||
external_url: MINT_PARAMS.externalUrl,
|
||||
attributes: [
|
||||
{
|
||||
trait_type: 'ENS',
|
||||
value: MINT_PARAMS.ens,
|
||||
},
|
||||
{
|
||||
trait_type: 'Commit Hash',
|
||||
value: MINT_PARAMS.commitHash,
|
||||
},
|
||||
{
|
||||
trait_type: 'Repository',
|
||||
value: MINT_PARAMS.gitRepository,
|
||||
},
|
||||
{
|
||||
trait_type: 'Version',
|
||||
value: '0',
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it('should match the token owner', async () => {
|
||||
const { contract, owner } = fixture;
|
||||
const tokenOwner = await contract.ownerOf(tokenId);
|
||||
expect(tokenOwner).to.equal(owner.address);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,58 +1,45 @@
|
|||
pragma solidity ^0.8.7;
|
||||
|
||||
import "forge-std/Test.sol";
|
||||
import "../../contracts/FleekERC721.sol";
|
||||
import "../../contracts/FleekERC721.sol";
|
||||
|
||||
contract ContractBTest is Test {
|
||||
FleekERC721 fleekContract;
|
||||
uint256 testNumber;
|
||||
|
||||
function setUp() public {
|
||||
fleekContract = new FleekERC721('Test Contract', 'FLKAPS');
|
||||
fleekContract = new FleekERC721("Test Contract", "FLKAPS");
|
||||
}
|
||||
|
||||
function testName() public {
|
||||
assertEq(fleekContract.name(), 'Test Contract'));
|
||||
assertEq(fleekContract.name(), "Test Contract");
|
||||
}
|
||||
|
||||
function testSymbol() public {
|
||||
assertEq(fleekContract.symbol(), 'FLKAPS'));
|
||||
assertEq(fleekContract.symbol(), "FLKAPS");
|
||||
}
|
||||
|
||||
function testMint() public {
|
||||
}
|
||||
function testMint() public {}
|
||||
|
||||
function testTokenURI() public {
|
||||
}
|
||||
function testTokenURI() public {}
|
||||
|
||||
function testBurn() public {
|
||||
}
|
||||
function testBurn() public {}
|
||||
|
||||
function testSetTokenName() public {
|
||||
}
|
||||
function testSetTokenName() public {}
|
||||
|
||||
function testSetTokenDescription() public {
|
||||
}
|
||||
function testSetTokenDescription() public {}
|
||||
|
||||
function testSetTokenImage() public {
|
||||
}
|
||||
function testSetTokenImage() public {}
|
||||
|
||||
function testSetTokenExternalURL() public {
|
||||
}
|
||||
function testSetTokenExternalURL() public {}
|
||||
|
||||
function testSetTokenBuild() public {
|
||||
}
|
||||
function testSetTokenBuild() public {}
|
||||
|
||||
function testUpgradeTokenBuild() public {
|
||||
}
|
||||
function testUpgradeTokenBuild() public {}
|
||||
|
||||
function testSetTokenENS() public {
|
||||
}
|
||||
function testSetTokenENS() public {}
|
||||
|
||||
function testAddTokenController() public {
|
||||
}
|
||||
|
||||
function testRemoveTokenController() public {
|
||||
}
|
||||
function testAddTokenController() public {}
|
||||
|
||||
function testRemoveTokenController() public {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,46 @@
|
|||
{
|
||||
"name": "sites-as-nfts",
|
||||
"version": "0.0.1",
|
||||
"description": "Minimal UI for sites as NFTs",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"author": "Fleek",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"path": "^0.12.7",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^29.2.3",
|
||||
"@types/node": "^18.11.9",
|
||||
"@types/react": "^18.0.25",
|
||||
"@types/react-dom": "^18.0.9",
|
||||
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
||||
"@typescript-eslint/parser": "^5.45.0",
|
||||
"@vitejs/plugin-react": "^2.2.0",
|
||||
"eslint": "^8.28.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-jest": "^27.1.6",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"eslint-plugin-react": "^7.31.11",
|
||||
"prettier": "^2.8.0",
|
||||
"ts-loader": "^9.4.1",
|
||||
"typescript": "^4.9.3",
|
||||
"vite": "^3.2.4",
|
||||
"vite-tsconfig-paths": "^3.6.0"
|
||||
}
|
||||
}
|
||||
{
|
||||
"name": "sites-as-nfts",
|
||||
"version": "0.0.1",
|
||||
"description": "Minimal UI for sites as NFTs",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"author": "Fleek",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@chakra-ui/icons": "^2.0.13",
|
||||
"@chakra-ui/react": "^2.4.2",
|
||||
"@emotion/react": "^11.10.5",
|
||||
"@emotion/styled": "^11.10.5",
|
||||
"formik": "^2.2.9",
|
||||
"framer-motion": "^7.6.17",
|
||||
"path": "^0.12.7",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-router-dom": "^6.4.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^29.2.3",
|
||||
"@types/node": "^18.11.9",
|
||||
"@types/react": "^18.0.25",
|
||||
"@types/react-dom": "^18.0.9",
|
||||
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
||||
"@typescript-eslint/parser": "^5.45.0",
|
||||
"@vitejs/plugin-react": "^2.2.0",
|
||||
"eslint": "^8.28.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-jest": "^27.1.6",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"eslint-plugin-react": "^7.31.11",
|
||||
"ethers": "^5.7.2",
|
||||
"prettier": "^2.8.0",
|
||||
"react-query": "^3.39.2",
|
||||
"ts-loader": "^9.4.1",
|
||||
"typescript": "^4.9.3",
|
||||
"vite": "^3.2.4",
|
||||
"vite-tsconfig-paths": "^3.6.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
.main {
|
||||
text-align: center;
|
||||
}
|
||||
|
|
@ -1,10 +1,17 @@
|
|||
import React from 'react';
|
||||
import './App.css';
|
||||
import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom';
|
||||
import { Home, MintSite, MintedSiteDetail } from './views';
|
||||
|
||||
export const App = () => {
|
||||
return (
|
||||
<div className="main">
|
||||
<h1>Welcome to Sites as NFTs by Fleek</h1>
|
||||
</div>
|
||||
<BrowserRouter>
|
||||
<Routes>
|
||||
<Route path="/mint-site" element={<MintSite />} />
|
||||
<Route path="/home" element={<Home />} />
|
||||
<Route path="/detail" element={<MintedSiteDetail />} />
|
||||
<Route path="*" element={<Navigate to="/home" />} />
|
||||
</Routes>
|
||||
</BrowserRouter>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
import {
|
||||
AccordionItem as AccordionItemChakra,
|
||||
AccordionButton,
|
||||
Box,
|
||||
Heading,
|
||||
AccordionIcon,
|
||||
AccordionPanel,
|
||||
AccordionPanelProps,
|
||||
forwardRef,
|
||||
} from '@chakra-ui/react';
|
||||
import React from 'react';
|
||||
|
||||
type AccordionProps = AccordionPanelProps & {
|
||||
children: React.ReactNode;
|
||||
heading: string;
|
||||
};
|
||||
export const AccordionItem = forwardRef<AccordionProps, 'div'>(
|
||||
({ children, heading, ...panelProps }, ref) => {
|
||||
return (
|
||||
<AccordionItemChakra>
|
||||
<AccordionButton borderBottomWidth="1px">
|
||||
<Box flex="1" textAlign="left">
|
||||
<Heading size="md"> {heading}</Heading>
|
||||
</Box>
|
||||
<AccordionIcon />
|
||||
</AccordionButton>
|
||||
<AccordionPanel ref={ref} {...panelProps} pb={4} overflowY="scroll">
|
||||
{children}
|
||||
</AccordionPanel>
|
||||
</AccordionItemChakra>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './accordion-item';
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
import { SiteNFTDetail } from '@/types';
|
||||
import { HStack } from '@chakra-ui/react';
|
||||
import { CardAttributes } from '../card';
|
||||
|
||||
type AttributesDetailProps = {
|
||||
owner: string;
|
||||
attributes: SiteNFTDetail['attributes'];
|
||||
tokendId: string;
|
||||
};
|
||||
|
||||
export const AttributesDetail = ({
|
||||
owner,
|
||||
attributes,
|
||||
tokendId,
|
||||
}: AttributesDetailProps) => {
|
||||
return (
|
||||
<HStack shouldWrapChildren display="inline" spacing="0px">
|
||||
<CardAttributes heading="Owner" info={owner} />
|
||||
{attributes.map((attribute) => (
|
||||
<CardAttributes
|
||||
key={attribute.trait_type}
|
||||
heading={attribute.trait_type}
|
||||
info={attribute.value}
|
||||
/>
|
||||
))}
|
||||
<CardAttributes heading="Token ID" info={tokendId} />
|
||||
</HStack>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './attributes-detail';
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
import { Card, CardBody } from '@chakra-ui/react';
|
||||
import { TileInfo } from '../tile-info';
|
||||
|
||||
type CardAttributesProps = {
|
||||
heading: string;
|
||||
info: string;
|
||||
};
|
||||
|
||||
export const CardAttributes = ({ heading, info }: CardAttributesProps) => (
|
||||
<Card
|
||||
mr="10px"
|
||||
mb="5px"
|
||||
direction={{ base: 'column', sm: 'row' }}
|
||||
overflow="hidden"
|
||||
variant="outline"
|
||||
width="200px"
|
||||
>
|
||||
<CardBody width="200px">
|
||||
<TileInfo size="sm" heading={heading} info={info} widthText={160} />
|
||||
</CardBody>
|
||||
</Card>
|
||||
);
|
||||
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
import { ImagePreview, TileInfo } from '@/components';
|
||||
import { SiteNFTDetail } from '@/types';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import {
|
||||
Box,
|
||||
Card,
|
||||
CardBody,
|
||||
Heading,
|
||||
LayoutProps,
|
||||
Link,
|
||||
Stack,
|
||||
} from '@chakra-ui/react';
|
||||
import React from 'react';
|
||||
|
||||
interface CardSiteProps {
|
||||
site: SiteNFTDetail;
|
||||
tokenId?: string; // TODO add param and remove optional
|
||||
}
|
||||
|
||||
type InfoContainerProps = {
|
||||
heading: string;
|
||||
info: React.ReactNode;
|
||||
width: LayoutProps['width'];
|
||||
};
|
||||
|
||||
const InfoContainer = ({ heading, info, width }: InfoContainerProps) => (
|
||||
<TileInfo
|
||||
size="xs"
|
||||
direction="row"
|
||||
mr="5px"
|
||||
width={width}
|
||||
heading={heading}
|
||||
textAlignText="left"
|
||||
info={info}
|
||||
/>
|
||||
);
|
||||
|
||||
export const SiteCard: React.FC<CardSiteProps> = ({ site, tokenId }) => {
|
||||
const { name, owner, image, externalUrl } = site;
|
||||
const navigate = useNavigate();
|
||||
return (
|
||||
<Card
|
||||
borderColor="#f3f3f36b !important"
|
||||
boxShadow="1px 10px 24px -2px #85848480"
|
||||
backgroundColor="#c5c5c50a"
|
||||
border="1px"
|
||||
borderRadius="10px"
|
||||
width="350px"
|
||||
height="350px"
|
||||
// TODO add token id param
|
||||
onClick={() => {
|
||||
navigate(`/detail?tokenId=${1}`);
|
||||
}}
|
||||
>
|
||||
<CardBody width="350px" height="350px" paddingTop="10px">
|
||||
<Heading size="md" textAlign="center" marginBottom="10px">
|
||||
{name}
|
||||
</Heading>
|
||||
<Link
|
||||
href={externalUrl}
|
||||
isExternal
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
<Box height="180px">
|
||||
<ImagePreview
|
||||
backgroundColor="#161616"
|
||||
display="block"
|
||||
marginLeft="auto"
|
||||
marginRight="auto"
|
||||
image={image}
|
||||
objectFit="contain"
|
||||
width="100%"
|
||||
height="100%"
|
||||
borderRadius="20px"
|
||||
boxShadow="0px 12px 24px -5px #5a575761"
|
||||
/>
|
||||
</Box>
|
||||
</Link>
|
||||
<Stack mt="10px" spacing="3" overflowY="scroll">
|
||||
<InfoContainer heading="Owner" info={owner} width="auto" />
|
||||
{/* TODO add param */}
|
||||
<InfoContainer heading="Token ID" info="1" width="100px" />
|
||||
<InfoContainer
|
||||
heading="External url"
|
||||
width="100px"
|
||||
info={
|
||||
<Link
|
||||
href={externalUrl}
|
||||
isExternal
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
<u>{externalUrl}</u>
|
||||
</Link>
|
||||
}
|
||||
/>
|
||||
</Stack>
|
||||
</CardBody>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export * from './card-attributes';
|
||||
export * from './card-site';
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
import { ArrowBackIcon } from '@chakra-ui/icons';
|
||||
import { IconButton } from '@chakra-ui/react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
export const HomeButton = () => {
|
||||
return (
|
||||
<IconButton
|
||||
as={Link}
|
||||
to="/home"
|
||||
aria-label="back home"
|
||||
icon={<ArrowBackIcon />}
|
||||
variant="link"
|
||||
size={'xl'}
|
||||
textDecoration={'none'}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './home-button';
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
import { forwardRef, Image, ImageProps } from '@chakra-ui/react';
|
||||
|
||||
type ImagePreviewProps = ImageProps & {
|
||||
image: string;
|
||||
};
|
||||
|
||||
export const ImagePreview = forwardRef<ImagePreviewProps, 'img'>(
|
||||
({ image, ...imageProps }, ref) => {
|
||||
return (
|
||||
<>
|
||||
{/* TODO add fallback Image */}
|
||||
<Image
|
||||
ref={ref}
|
||||
src={image}
|
||||
{...imageProps}
|
||||
fallbackSrc="https://via.placeholder.com/150"
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './image-preview';
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
export * from './loading';
|
||||
export * from './home-button';
|
||||
export * from './image-preview';
|
||||
export * from './tile-info';
|
||||
export * from './card';
|
||||
export * from './accordion-item';
|
||||
export * from './input-field-form';
|
||||
export * from './attributes-detail';
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './input-field-form';
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
import {
|
||||
FormControl,
|
||||
FormControlProps,
|
||||
FormErrorMessage,
|
||||
FormLabel,
|
||||
forwardRef,
|
||||
Input,
|
||||
} from '@chakra-ui/react';
|
||||
import { Field } from 'formik';
|
||||
|
||||
type InputFieldFormProps = FormControlProps & {
|
||||
label: string;
|
||||
fieldName: string;
|
||||
error?: string;
|
||||
};
|
||||
export const InputFieldForm = forwardRef<InputFieldFormProps, 'div'>(
|
||||
({ label, fieldName, error, ...formControlProps }, ref) => (
|
||||
<FormControl ref={ref} {...formControlProps}>
|
||||
<FormLabel htmlFor={fieldName}>{label}</FormLabel>
|
||||
<Field as={Input} name={fieldName} id={fieldName} type="text" />
|
||||
{error && <FormErrorMessage>{error}</FormErrorMessage>}
|
||||
</FormControl>
|
||||
)
|
||||
);
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './loading';
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
import { Flex, Spinner } from '@chakra-ui/react';
|
||||
|
||||
export const Loading = () => {
|
||||
return (
|
||||
<Flex justifyContent="center" height="80vh" alignItems="center">
|
||||
<Spinner
|
||||
thickness="3px"
|
||||
speed="0.65s"
|
||||
emptyColor="gray.200"
|
||||
color="blue.500"
|
||||
size="xl"
|
||||
/>
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './tile-info';
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
import {
|
||||
Flex,
|
||||
forwardRef,
|
||||
Heading,
|
||||
HeadingProps,
|
||||
Text,
|
||||
} from '@chakra-ui/react';
|
||||
|
||||
type TileInfoProps = HeadingProps & {
|
||||
heading: string;
|
||||
info: React.ReactNode;
|
||||
widthText?: number;
|
||||
textAlignText?: 'center' | 'left';
|
||||
direction?: 'column' | 'row';
|
||||
alignItems?: string;
|
||||
};
|
||||
|
||||
export const TileInfo = forwardRef<TileInfoProps, 'h2'>(
|
||||
(
|
||||
{
|
||||
heading,
|
||||
info,
|
||||
widthText = 250,
|
||||
textAlignText = 'center',
|
||||
direction = 'column',
|
||||
alignItems = 'center',
|
||||
...headingProps
|
||||
},
|
||||
ref
|
||||
) => (
|
||||
<Flex direction={direction} alignItems={alignItems}>
|
||||
<Heading ref={ref} {...headingProps}>
|
||||
{heading}
|
||||
</Heading>
|
||||
<Text
|
||||
width={widthText}
|
||||
whiteSpace="nowrap"
|
||||
overflow="hidden"
|
||||
textOverflow="ellipsis"
|
||||
textAlign={textAlignText}
|
||||
>
|
||||
{info}
|
||||
</Text>
|
||||
</Flex>
|
||||
)
|
||||
);
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './use-toast';
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
import { useToast as useToastChakra } from '@chakra-ui/react';
|
||||
|
||||
export const useToast = () => {
|
||||
return useToastChakra({
|
||||
duration: 3000,
|
||||
isClosable: true,
|
||||
});
|
||||
};
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
:root {
|
||||
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
font-weight: 400;
|
||||
|
||||
color-scheme: light dark;
|
||||
color: rgba(255, 255, 255, 0.87);
|
||||
background-color: #242424;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 3.2em;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
|
@ -1,7 +1,11 @@
|
|||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import './index.css';
|
||||
import { App } from './App';
|
||||
import { App } from './app';
|
||||
import { ChakraProvider } from '@chakra-ui/react';
|
||||
import { theme } from './theme';
|
||||
import { QueryClient, QueryClientProvider } from 'react-query';
|
||||
|
||||
const queryClient = new QueryClient();
|
||||
|
||||
const root = ReactDOM.createRoot(
|
||||
document.getElementById('root') as HTMLElement
|
||||
|
|
@ -9,7 +13,11 @@ const root = ReactDOM.createRoot(
|
|||
|
||||
root.render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
<ChakraProvider theme={theme} resetCSS>
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<App />
|
||||
</QueryClientProvider>
|
||||
</ChakraProvider>
|
||||
</React.StrictMode>
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
const MINT_PARAMS = {
|
||||
name: 'Fleek Test App',
|
||||
description: 'Fleek Test App Description',
|
||||
image: 'https://storageapi.fleek.co/fleek-team-bucket/site/fleek-logo.png',
|
||||
ens: 'fleek.eth',
|
||||
externalUrl: 'https://fleek.co',
|
||||
commitHash: 'b72e47171746b6a9e29b801af9cb655ecf4d665c',
|
||||
gitRepository: 'https://github.com/fleekxyz/contracts',
|
||||
author: 'author',
|
||||
};
|
||||
|
||||
const mockDetail = {
|
||||
owner: '0x8f7b9e1b5f1f2c3c1f8b0b1b2e1b2f1f2c3c1f8b',
|
||||
name: MINT_PARAMS.name,
|
||||
description: MINT_PARAMS.description,
|
||||
image: MINT_PARAMS.image,
|
||||
external_url: MINT_PARAMS.externalUrl,
|
||||
attributes: [
|
||||
{
|
||||
trait_type: 'ENS',
|
||||
value: MINT_PARAMS.ens,
|
||||
},
|
||||
{
|
||||
trait_type: 'Commit Hash',
|
||||
value: MINT_PARAMS.commitHash,
|
||||
},
|
||||
{
|
||||
trait_type: 'Repository',
|
||||
value: MINT_PARAMS.gitRepository,
|
||||
},
|
||||
//As we're not showing this on the UI, we can remove it
|
||||
// {
|
||||
// trait_type: 'Author',
|
||||
// value: MINT_PARAMS.author,
|
||||
// },
|
||||
// {
|
||||
// trait_type: 'Version',
|
||||
// value: '0',
|
||||
// },
|
||||
],
|
||||
};
|
||||
|
||||
export const fetchSiteDetail = async (tokenId: string) => {
|
||||
//TODO get site detail from api
|
||||
return new Promise((resolved, reject) => {
|
||||
setTimeout(() => {
|
||||
resolved({
|
||||
data: { ...mockDetail, externalUrl: mockDetail.external_url },
|
||||
});
|
||||
}, 2500);
|
||||
});
|
||||
};
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
export * from './mint-site';
|
||||
export * from './detail';
|
||||
export * from './list';
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
const listSites = [
|
||||
{
|
||||
tokenId: 1,
|
||||
name: 'Fleek Test App',
|
||||
owner: '0x1b5b3e8a7c245d0f2d2b2e29ba11c03ef086c06e',
|
||||
description:
|
||||
'Roronoa Zoro, also known as `Pirate Hunter` Zoro, is the combatant of the Straw Hat Pirates, one of their two swordsmen and one of the Senior Officers of the Straw Hat Grand Fleet. Formerly a bounty hunter, he is the second member of Luffy`s crew and the first to join it, doing so in the Romance Dawn Arc.',
|
||||
image:
|
||||
'https://i.seadn.io/gae/Z0t4BsFONk8ebFnTtog3ricAhEpW_ZPhyhxcjHpofCmslJUc5jQ0OjxUuJbU5-3XE0rJZFf6JVdPFZYqtqyg2ri4gAGRpfwkFcidpw4?auto=format&w=1000',
|
||||
externalUrl: 'https://onepiece.fandom.com/wiki/Roronoa_Zoro',
|
||||
ens: 'zoro.eth',
|
||||
commitHash: '6ea6ad16c46ae85faced7e50555ff7368422f57',
|
||||
githubRepo: 'https://github.com/fleekxyz/contracts',
|
||||
},
|
||||
{
|
||||
tokenId: 2,
|
||||
name: 'Fleek Test App',
|
||||
owner: '0x1b5b3e8a7c245d0f2d2b2e29ba11c03ef086c06e',
|
||||
description:
|
||||
' Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.',
|
||||
image: 'https://storageapi.fleek.co/fleek-team-bucket/site/fleek-logo.png',
|
||||
externalUrl: 'https://fleek.co',
|
||||
ens: 'fleek.eth',
|
||||
commitHash: '6ea6ad16c46ae85faced7e50555ff7368422f57',
|
||||
githubRepo: 'https://github.com/fleekxyz/contracts',
|
||||
},
|
||||
];
|
||||
|
||||
export const fetchMintedSites = async () => {
|
||||
//TODO get minted sites from api
|
||||
return new Promise((resolved) => {
|
||||
setTimeout(() => {
|
||||
resolved({
|
||||
listSites,
|
||||
});
|
||||
}, 2500);
|
||||
});
|
||||
};
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
import { SiteNFT } from '@/types';
|
||||
|
||||
export const mintSiteNFT = async (props: SiteNFT) => {
|
||||
const { name, description, owner, externalUrl, ens, commitHash, repo } =
|
||||
props;
|
||||
return new Promise((resolved, rejected) => {
|
||||
setTimeout(() => {
|
||||
// returning data of the site for now
|
||||
// just leave rejected for testing purposes
|
||||
resolved({
|
||||
status: 'success',
|
||||
data: {
|
||||
name,
|
||||
description,
|
||||
owner,
|
||||
externalUrl,
|
||||
ens,
|
||||
commitHash,
|
||||
repo,
|
||||
},
|
||||
});
|
||||
}, 1000);
|
||||
});
|
||||
};
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
import { extendTheme } from '@chakra-ui/react';
|
||||
|
||||
const appTheme = {
|
||||
styles: {
|
||||
global: {
|
||||
body: {
|
||||
color: 'rgba(255, 255, 255)',
|
||||
bg: '#161616',
|
||||
margin: '50px',
|
||||
},
|
||||
},
|
||||
},
|
||||
fonts: {
|
||||
heading: 'Nunito Sans,Helvetica,Arial,Lucida,sans-serif',
|
||||
body: 'Nunito Sans,Helvetica,Arial,Lucida,sans-serif',
|
||||
},
|
||||
sizes: {
|
||||
modalHeight: '345px',
|
||||
},
|
||||
};
|
||||
|
||||
export const theme = extendTheme(appTheme);
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './mint-site';
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
export type SiteNFT = {
|
||||
name: string;
|
||||
description: string;
|
||||
owner: string;
|
||||
externalUrl: string;
|
||||
image: string;
|
||||
ens?: string;
|
||||
commitHash: string;
|
||||
repo: string;
|
||||
};
|
||||
|
||||
export type SiteNFTDetail = Omit<SiteNFT, 'ens' | 'commitHash' | 'repo'> & {
|
||||
attributes: [
|
||||
{
|
||||
trait_type: string;
|
||||
value: string;
|
||||
}
|
||||
];
|
||||
};
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
export const getRepoAndCommit = (url: string) => {
|
||||
//TODO validate is a github url
|
||||
url = url.replace('/commit', '');
|
||||
const lastIndexSlash = url.lastIndexOf('/');
|
||||
const repo = url.substring(0, lastIndexSlash + 1).slice(0, lastIndexSlash);
|
||||
const commit_hash = url.substring(lastIndexSlash + 1, url.length);
|
||||
return { repo, commit_hash };
|
||||
};
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export * from './format';
|
||||
export * from './validation';
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
export const isValidUrl = (url: string) => {
|
||||
const regex =
|
||||
/(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
|
||||
return regex.test(url);
|
||||
};
|
||||
|
||||
export const isValidImageUrl = (url: string) => {
|
||||
const regex = /^https?:\/\/.+\.(jpg|jpeg|png|gif|svg)$/;
|
||||
return regex.test(url);
|
||||
};
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
import { useSearchParams } from 'react-router-dom';
|
||||
import { useQuery } from 'react-query';
|
||||
import {
|
||||
Accordion,
|
||||
Box,
|
||||
Card,
|
||||
CardBody,
|
||||
Flex,
|
||||
Heading,
|
||||
Link,
|
||||
VStack,
|
||||
} from '@chakra-ui/react';
|
||||
import {
|
||||
HomeButton,
|
||||
ImagePreview,
|
||||
AccordionItem,
|
||||
Loading,
|
||||
AttributesDetail,
|
||||
} from '@/components';
|
||||
import { ExternalLinkIcon } from '@chakra-ui/icons';
|
||||
import { fetchSiteDetail } from '@/mocks';
|
||||
import { ErrorScreen } from '@/views';
|
||||
import { SiteNFTDetail } from '@/types';
|
||||
|
||||
export const MintedSiteDetail = () => {
|
||||
const [searchParams] = useSearchParams();
|
||||
const tokenIdParam = searchParams.get('tokenId');
|
||||
//TODO handle response type
|
||||
const { data, status } = useQuery('fetchDetail', () =>
|
||||
fetchSiteDetail(tokenIdParam as string)
|
||||
);
|
||||
|
||||
if (status === 'loading') {
|
||||
return <Loading />;
|
||||
}
|
||||
|
||||
if (status === 'error') {
|
||||
return <ErrorScreen />;
|
||||
}
|
||||
|
||||
const { owner, name, description, image, externalUrl, attributes } =
|
||||
data.data as SiteNFTDetail;
|
||||
return (
|
||||
<>
|
||||
<Flex width="full" align="center" justifyContent="center">
|
||||
<Box width={{ base: '100%' }}>
|
||||
<HomeButton />
|
||||
<Box
|
||||
flexDirection="row"
|
||||
display="flex"
|
||||
justifyContent="space-evenly"
|
||||
mt={10}
|
||||
>
|
||||
<Box mr={5}>
|
||||
<Box
|
||||
display="flex"
|
||||
flexDirection="row"
|
||||
alignItems="flex-end"
|
||||
mb={5}
|
||||
>
|
||||
<Heading mr={5}>{name}</Heading>
|
||||
</Box>
|
||||
<Card backgroundColor="transparent" border="1px">
|
||||
<CardBody padding="1px 8px 10px 8px">
|
||||
<Accordion defaultIndex={[0, 1]} allowMultiple width="45vw">
|
||||
<AccordionItem
|
||||
heading="Description"
|
||||
minH={120}
|
||||
maxH="auto"
|
||||
children={<p>{description}</p>}
|
||||
/>
|
||||
<AccordionItem
|
||||
heading="Attributes"
|
||||
children={
|
||||
<AttributesDetail
|
||||
owner={owner}
|
||||
attributes={attributes}
|
||||
tokendId={tokenIdParam as string}
|
||||
/>
|
||||
}
|
||||
padding="16px"
|
||||
/>
|
||||
</Accordion>
|
||||
<Box ml={5} mt={2}>
|
||||
<Link href={externalUrl} isExternal>
|
||||
Visit site <ExternalLinkIcon mx="2px" />
|
||||
</Link>
|
||||
</Box>
|
||||
</CardBody>
|
||||
</Card>
|
||||
</Box>
|
||||
<VStack alignItems="flex-start">
|
||||
<Box
|
||||
border="1px"
|
||||
width="-webkit-fill-available"
|
||||
padding="5px 10px"
|
||||
borderTopRadius={10}
|
||||
>
|
||||
<Heading size="md">Preview</Heading>
|
||||
</Box>
|
||||
<Box
|
||||
mt="0px !important"
|
||||
boxSize="md"
|
||||
border="1px"
|
||||
padding={10}
|
||||
borderRadius={20}
|
||||
borderTopRadius={0}
|
||||
boxShadow="12px 10px 14px 6px #868686d1"
|
||||
>
|
||||
<ImagePreview
|
||||
image={image}
|
||||
width="auto"
|
||||
height="auto"
|
||||
maxW="100%"
|
||||
maxH="100%"
|
||||
/>
|
||||
</Box>
|
||||
</VStack>
|
||||
</Box>
|
||||
</Box>
|
||||
</Flex>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './detail';
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
import { Flex, Heading } from '@chakra-ui/react';
|
||||
|
||||
export const ErrorScreen = () => {
|
||||
return (
|
||||
<Flex justifyContent="center" height="80vh" alignItems="center">
|
||||
<Heading size="md">Something went wrong</Heading>
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './error-screen';
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
import React from 'react';
|
||||
import { Heading, Button } from '@chakra-ui/react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { Flex } from '@chakra-ui/react';
|
||||
import { ListSites } from './list';
|
||||
|
||||
export const Home = () => {
|
||||
return (
|
||||
<Flex flexDirection="column" alignItems="center">
|
||||
<Heading marginTop="80px">Welcome to Sites as NFTs by Fleek</Heading>
|
||||
<Button as={Link} to="/mint-site" mt="20px" mb="50px">
|
||||
Mint your site
|
||||
</Button>
|
||||
<ListSites />
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
export * from './home';
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
import React from 'react';
|
||||
import { Loading } from '@/components';
|
||||
import { fetchMintedSites } from '@/mocks';
|
||||
import { SiteNFTDetails } from '@/types';
|
||||
import { Grid, GridItem } from '@chakra-ui/react';
|
||||
import { useQuery } from 'react-query';
|
||||
import { SiteCard } from '@/components';
|
||||
|
||||
export const ListSites = () => {
|
||||
const { data, isLoading } = useQuery<Array<SiteNFTDetails>, Error>(
|
||||
'fetchSites',
|
||||
fetchMintedSites
|
||||
);
|
||||
|
||||
if (isLoading) return <Loading />;
|
||||
return (
|
||||
<Grid
|
||||
templateColumns={{ base: 'repeat(4, 1fr)', md: 'repeat(5, 1fr)' }}
|
||||
gap={10}
|
||||
mt="40px"
|
||||
>
|
||||
{data &&
|
||||
data.listSites.map((site: SiteNFTDetails) => (
|
||||
<GridItem key={site.tokenId}>
|
||||
<SiteCard site={site} />
|
||||
</GridItem>
|
||||
))}
|
||||
</Grid>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
export * from './home';
|
||||
export * from './mint-site';
|
||||
export * from './detail';
|
||||
export * from './error-screen';
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
export * from './mint-site';
|
||||
export * from './mint-site.utils';
|
||||
|
|
@ -0,0 +1,215 @@
|
|||
import { useCallback } from 'react';
|
||||
import {
|
||||
Heading,
|
||||
Flex,
|
||||
Box,
|
||||
FormControl,
|
||||
FormLabel,
|
||||
Button,
|
||||
FormErrorMessage,
|
||||
IconButton,
|
||||
Textarea,
|
||||
Grid,
|
||||
GridItem,
|
||||
} from '@chakra-ui/react';
|
||||
import { Formik, Field } from 'formik';
|
||||
import { ArrowBackIcon } from '@chakra-ui/icons';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { mintSiteNFT } from '@/mocks';
|
||||
import { getRepoAndCommit } from '@/utils';
|
||||
import { validateFields } from './mint-site.utils';
|
||||
import { InputFieldForm } from '@/components';
|
||||
import { useToast } from '@/hooks';
|
||||
|
||||
interface FormValues {
|
||||
name: string;
|
||||
description: string;
|
||||
githubCommit: string;
|
||||
ownerAddress: string;
|
||||
externalUrl: string;
|
||||
image: string;
|
||||
ens?: string;
|
||||
}
|
||||
|
||||
const initialValues = {
|
||||
name: '',
|
||||
description: '',
|
||||
githubCommit: '',
|
||||
ownerAddress: '',
|
||||
externalUrl: '',
|
||||
image: '',
|
||||
ens: '',
|
||||
} as FormValues;
|
||||
|
||||
export const MintSite = () => {
|
||||
const setToastInfo = useToast();
|
||||
|
||||
const handleSubmitForm = useCallback(async (values: FormValues) => {
|
||||
const {
|
||||
name,
|
||||
description,
|
||||
githubCommit,
|
||||
ownerAddress,
|
||||
externalUrl,
|
||||
image,
|
||||
ens,
|
||||
} = values;
|
||||
|
||||
const { repo, commit_hash } = getRepoAndCommit(githubCommit);
|
||||
|
||||
try {
|
||||
await mintSiteNFT({
|
||||
name,
|
||||
description,
|
||||
owner: ownerAddress,
|
||||
externalUrl,
|
||||
image,
|
||||
ens,
|
||||
commitHash: commit_hash,
|
||||
repo,
|
||||
});
|
||||
//TODO connect with the integration
|
||||
setToastInfo({
|
||||
title: 'Success!',
|
||||
description: 'Your site has been minted.',
|
||||
status: 'success',
|
||||
});
|
||||
} catch (err) {
|
||||
setToastInfo({
|
||||
title: 'Error!',
|
||||
description:
|
||||
'We had an error while minting your site. Please try again later',
|
||||
status: 'error',
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Flex width="full" align="center" justifyContent="center" mt="50px">
|
||||
<Box width={{ base: '100%', md: '80%' }}>
|
||||
<IconButton
|
||||
as={Link}
|
||||
to="/home"
|
||||
aria-label="back home"
|
||||
icon={<ArrowBackIcon />}
|
||||
variant="link"
|
||||
size={'xl'}
|
||||
textDecoration={'none'}
|
||||
/>
|
||||
<Box textAlign="center" mt={2}>
|
||||
<Heading>Mint your Site</Heading>
|
||||
</Box>
|
||||
<Box my={4} textAlign="left">
|
||||
<Formik
|
||||
validate={validateFields}
|
||||
initialValues={initialValues}
|
||||
onSubmit={handleSubmitForm}
|
||||
>
|
||||
{({ values, touched, handleSubmit, isSubmitting, errors }) => (
|
||||
<form onSubmit={handleSubmit}>
|
||||
<Box
|
||||
display="flex"
|
||||
flexDirection={{ base: 'column', md: 'row' }}
|
||||
>
|
||||
<InputFieldForm
|
||||
label="Name"
|
||||
fieldName="name"
|
||||
mr={5}
|
||||
error={errors.name}
|
||||
isInvalid={!!errors.name && touched.name}
|
||||
isRequired
|
||||
/>
|
||||
<InputFieldForm
|
||||
label="Owner address"
|
||||
fieldName="ownerAddress"
|
||||
error={errors.ownerAddress}
|
||||
isInvalid={!!errors.ownerAddress && touched.ownerAddress}
|
||||
isRequired
|
||||
/>
|
||||
</Box>
|
||||
<FormControl
|
||||
mt={6}
|
||||
isRequired
|
||||
isInvalid={!!errors.description && touched.description}
|
||||
>
|
||||
<FormLabel htmlFor="description">Description</FormLabel>
|
||||
<Field as={Textarea} name="description" id="description" />
|
||||
{errors.description && (
|
||||
<FormErrorMessage>{errors.description}</FormErrorMessage>
|
||||
)}
|
||||
</FormControl>
|
||||
<Box
|
||||
display="flex"
|
||||
flexDirection={{ base: 'column', md: 'row' }}
|
||||
mt={6}
|
||||
>
|
||||
<InputFieldForm
|
||||
label="Image (IPFS Link)"
|
||||
fieldName="image"
|
||||
mr={5}
|
||||
error={errors.image}
|
||||
isInvalid={!!errors.image && touched.image}
|
||||
isRequired
|
||||
/>
|
||||
<InputFieldForm
|
||||
label="External url"
|
||||
fieldName="externalUrl"
|
||||
error={errors.externalUrl}
|
||||
isInvalid={!!errors.externalUrl && touched.externalUrl}
|
||||
isRequired
|
||||
/>
|
||||
</Box>
|
||||
<Grid
|
||||
templateColumns={{
|
||||
md: 'repeat(3, 1fr)',
|
||||
}}
|
||||
gap={4}
|
||||
mt={6}
|
||||
>
|
||||
<GridItem colSpan={2}>
|
||||
<InputFieldForm
|
||||
label="Github commit url"
|
||||
fieldName="githubCommit"
|
||||
mr={5}
|
||||
error={errors.githubCommit}
|
||||
isInvalid={
|
||||
!!errors.githubCommit && touched.githubCommit
|
||||
}
|
||||
isRequired
|
||||
/>
|
||||
</GridItem>
|
||||
<GridItem colSpan={{ base: 2, md: 1 }}>
|
||||
<InputFieldForm label="ENS" fieldName="ens" />
|
||||
</GridItem>
|
||||
</Grid>
|
||||
<Button
|
||||
colorScheme="blue"
|
||||
backgroundColor="#1d4ed8"
|
||||
width="full"
|
||||
mt={4}
|
||||
type="submit"
|
||||
isLoading={isSubmitting}
|
||||
loadingText="Minting..."
|
||||
disabled={
|
||||
isSubmitting ||
|
||||
!values.name ||
|
||||
!values.description ||
|
||||
!values.githubCommit ||
|
||||
!values.ownerAddress ||
|
||||
!values.image ||
|
||||
!values.externalUrl
|
||||
}
|
||||
>
|
||||
Mint
|
||||
</Button>
|
||||
</form>
|
||||
)}
|
||||
</Formik>
|
||||
</Box>
|
||||
</Box>
|
||||
</Flex>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
import { isValidImageUrl, isValidUrl } from '@/utils';
|
||||
import { ethers } from 'ethers';
|
||||
import { FormikValues } from 'formik';
|
||||
|
||||
export const validateFields = (values: FormikValues) => {
|
||||
const errors: FormikValues = {};
|
||||
if (!values.name) {
|
||||
errors.name = 'Name cannot be empty';
|
||||
}
|
||||
if (!values.description) {
|
||||
errors.description = 'Description cannot be empty';
|
||||
}
|
||||
if (!values.githubCommit) {
|
||||
errors.githubCommit = 'Github commit cannot be empty';
|
||||
} else if (!isValidUrl(values.githubCommit)) {
|
||||
errors.githubCommit = 'Github commit is not a valid url';
|
||||
}
|
||||
if (!values.ownerAddress) {
|
||||
errors.ownerAddress = 'Owner address cannot be empty';
|
||||
} else if (!ethers.utils.isAddress(values.ownerAddress)) {
|
||||
errors.ownerAddress = 'Owner address is not a valid address';
|
||||
}
|
||||
if (!values.externalUrl) {
|
||||
errors.externalUrl = 'External url cannot be empty';
|
||||
} else if (!isValidUrl(values.externalUrl)) {
|
||||
errors.externalUrl = 'External url is not a valid url';
|
||||
}
|
||||
if (!values.image) {
|
||||
errors.image = 'Image cannot be empty';
|
||||
} else if (!isValidImageUrl(values.image)) {
|
||||
errors.image = 'Image url is not a valid url';
|
||||
}
|
||||
//TODO check if ENS is a valid ens name
|
||||
return errors;
|
||||
};
|
||||
|
|
@ -1,26 +1,25 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "ES2020",
|
||||
"target": "ESNext",
|
||||
"esModuleInterop": true,
|
||||
"sourceMap": true,
|
||||
"rootDirs": ["src"],
|
||||
"baseUrl": "src",
|
||||
"paths": {
|
||||
"@/*": ["*"]
|
||||
},
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"resolveJsonModule": true,
|
||||
"moduleResolution": "node",
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"jsx": "react-jsx",
|
||||
"strict": true,
|
||||
"noUnusedLocals": true,
|
||||
"skipLibCheck": true,
|
||||
"isolatedModules": true,
|
||||
"types": ["vite/client"]
|
||||
},
|
||||
"include": ["./src", "./*.ts"]
|
||||
}
|
||||
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "ES2020",
|
||||
"target": "ESNext",
|
||||
"esModuleInterop": true,
|
||||
"sourceMap": true,
|
||||
"rootDirs": ["src"],
|
||||
"baseUrl": "src",
|
||||
"paths": {
|
||||
"@/*": ["*"]
|
||||
},
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"resolveJsonModule": true,
|
||||
"moduleResolution": "node",
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"jsx": "react-jsx",
|
||||
"strict": true,
|
||||
"noUnusedLocals": true,
|
||||
"skipLibCheck": true,
|
||||
"isolatedModules": true,
|
||||
"types": ["vite/client"]
|
||||
},
|
||||
"include": ["./src", "./*.ts"]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
import { defineConfig } from 'vite';
|
||||
import react from '@vitejs/plugin-react';
|
||||
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react(), tsconfigPaths()],
|
||||
});
|
||||
|
||||
import { defineConfig } from 'vite';
|
||||
import react from '@vitejs/plugin-react';
|
||||
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react(), tsconfigPaths()],
|
||||
});
|
||||
|
|
|
|||
1855
ui/yarn.lock
1855
ui/yarn.lock
File diff suppressed because it is too large
Load Diff
385
yarn.lock
385
yarn.lock
|
|
@ -934,9 +934,9 @@
|
|||
integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==
|
||||
|
||||
"@types/node@*":
|
||||
version "18.11.11"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.11.tgz#1d455ac0211549a8409d3cdb371cd55cc971e8dc"
|
||||
integrity sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==
|
||||
version "18.11.15"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.15.tgz#de0e1fbd2b22b962d45971431e2ae696643d3f5d"
|
||||
integrity sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==
|
||||
|
||||
"@types/node@^10.0.3":
|
||||
version "10.17.60"
|
||||
|
|
@ -1124,6 +1124,11 @@ ansi-regex@^5.0.1:
|
|||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
|
||||
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
|
||||
|
||||
ansi-regex@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
|
||||
integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
|
||||
|
||||
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
|
||||
|
|
@ -1138,6 +1143,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
|
|||
dependencies:
|
||||
color-convert "^2.0.1"
|
||||
|
||||
ansi-styles@^6.0.0:
|
||||
version "6.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
|
||||
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
|
||||
|
||||
antlr4ts@^0.5.0-alpha.4:
|
||||
version "0.5.0-alpha.4"
|
||||
resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a"
|
||||
|
|
@ -1723,6 +1733,13 @@ clean-stack@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
|
||||
integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
|
||||
|
||||
cli-cursor@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
|
||||
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
|
||||
dependencies:
|
||||
restore-cursor "^3.1.0"
|
||||
|
||||
cli-table3@^0.5.0:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
|
||||
|
|
@ -1742,6 +1759,22 @@ cli-table3@^0.6.0:
|
|||
optionalDependencies:
|
||||
"@colors/colors" "1.5.0"
|
||||
|
||||
cli-truncate@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
|
||||
integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
|
||||
dependencies:
|
||||
slice-ansi "^3.0.0"
|
||||
string-width "^4.2.0"
|
||||
|
||||
cli-truncate@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389"
|
||||
integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==
|
||||
dependencies:
|
||||
slice-ansi "^5.0.0"
|
||||
string-width "^5.0.0"
|
||||
|
||||
cliui@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
|
||||
|
|
@ -1791,6 +1824,11 @@ color-name@~1.1.4:
|
|||
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||
|
||||
colorette@^2.0.19:
|
||||
version "2.0.19"
|
||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
|
||||
integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
|
||||
|
||||
colors@1.4.0, colors@^1.1.2:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
|
||||
|
|
@ -1813,6 +1851,11 @@ commander@3.0.2:
|
|||
resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
|
||||
integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
|
||||
|
||||
commander@^9.4.1:
|
||||
version "9.4.1"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd"
|
||||
integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==
|
||||
|
||||
concat-map@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
|
|
@ -1930,6 +1973,15 @@ cross-fetch@^3.1.4:
|
|||
dependencies:
|
||||
node-fetch "2.6.7"
|
||||
|
||||
cross-spawn@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
|
||||
dependencies:
|
||||
path-key "^3.1.0"
|
||||
shebang-command "^2.0.0"
|
||||
which "^2.0.1"
|
||||
|
||||
"crypt@>= 0.0.1":
|
||||
version "0.0.2"
|
||||
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
|
||||
|
|
@ -1986,7 +2038,7 @@ debug@3.2.6:
|
|||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3:
|
||||
debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
|
||||
version "4.3.4"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
||||
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||
|
|
@ -2126,6 +2178,11 @@ dotenv@^16.0.2:
|
|||
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07"
|
||||
integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==
|
||||
|
||||
eastasianwidth@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
|
||||
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
|
||||
|
||||
ecc-jsbn@~0.1.1:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
|
||||
|
|
@ -2167,6 +2224,11 @@ emoji-regex@^8.0.0:
|
|||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
|
||||
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
|
||||
|
||||
emoji-regex@^9.2.2:
|
||||
version "9.2.2"
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
|
||||
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
|
||||
|
||||
encode-utf8@^1.0.2:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
|
||||
|
|
@ -2197,9 +2259,9 @@ env-paths@^2.2.0:
|
|||
integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
|
||||
|
||||
es-abstract@^1.19.0, es-abstract@^1.20.4:
|
||||
version "1.20.4"
|
||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861"
|
||||
integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==
|
||||
version "1.20.5"
|
||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2"
|
||||
integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==
|
||||
dependencies:
|
||||
call-bind "^1.0.2"
|
||||
es-to-primitive "^1.2.1"
|
||||
|
|
@ -2207,6 +2269,7 @@ es-abstract@^1.19.0, es-abstract@^1.20.4:
|
|||
function.prototype.name "^1.1.5"
|
||||
get-intrinsic "^1.1.3"
|
||||
get-symbol-description "^1.0.0"
|
||||
gopd "^1.0.1"
|
||||
has "^1.0.3"
|
||||
has-property-descriptors "^1.0.0"
|
||||
has-symbols "^1.0.3"
|
||||
|
|
@ -2222,8 +2285,8 @@ es-abstract@^1.19.0, es-abstract@^1.20.4:
|
|||
object.assign "^4.1.4"
|
||||
regexp.prototype.flags "^1.4.3"
|
||||
safe-regex-test "^1.0.0"
|
||||
string.prototype.trimend "^1.0.5"
|
||||
string.prototype.trimstart "^1.0.5"
|
||||
string.prototype.trimend "^1.0.6"
|
||||
string.prototype.trimstart "^1.0.6"
|
||||
unbox-primitive "^1.0.2"
|
||||
|
||||
es-array-method-boxes-properly@^1.0.0:
|
||||
|
|
@ -2533,6 +2596,21 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
|
|||
md5.js "^1.3.4"
|
||||
safe-buffer "^5.1.1"
|
||||
|
||||
execa@^6.1.0:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20"
|
||||
integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==
|
||||
dependencies:
|
||||
cross-spawn "^7.0.3"
|
||||
get-stream "^6.0.1"
|
||||
human-signals "^3.0.1"
|
||||
is-stream "^3.0.0"
|
||||
merge-stream "^2.0.0"
|
||||
npm-run-path "^5.1.0"
|
||||
onetime "^6.0.0"
|
||||
signal-exit "^3.0.7"
|
||||
strip-final-newline "^3.0.0"
|
||||
|
||||
express@^4.14.0:
|
||||
version "4.18.2"
|
||||
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
|
||||
|
|
@ -2864,7 +2942,7 @@ get-func-name@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
|
||||
integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==
|
||||
|
||||
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3:
|
||||
get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
|
||||
integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
|
||||
|
|
@ -3032,9 +3110,9 @@ got@12.1.0:
|
|||
responselike "^2.0.0"
|
||||
|
||||
got@^11.8.5:
|
||||
version "11.8.5"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
|
||||
integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
|
||||
version "11.8.6"
|
||||
resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
|
||||
integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
|
||||
dependencies:
|
||||
"@sindresorhus/is" "^4.0.0"
|
||||
"@szmarczak/http-timer" "^4.0.5"
|
||||
|
|
@ -3120,9 +3198,9 @@ hardhat-gas-reporter@^1.0.9:
|
|||
sha1 "^1.1.1"
|
||||
|
||||
hardhat@^2.11.2:
|
||||
version "2.12.3"
|
||||
resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.3.tgz#1824c5d5e2bcc61601bee429053ccecb4dbc0adb"
|
||||
integrity sha512-qxOvRNgQnLqRFssn5f8VP5KN3caytShU0HNeKxmPVK1Ix/0xDVhIC7JOLxG69DjOihUfmxmjqspsHbZvFj6EhQ==
|
||||
version "2.12.4"
|
||||
resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.4.tgz#e539ba58bee9ba1a1ced823bfdcec0b3c5a3e70f"
|
||||
integrity sha512-rc9S2U/4M+77LxW1Kg7oqMMmjl81tzn5rNFARhbXKUA1am/nhfMJEujOjuKvt+ZGMiZ11PYSe8gyIpB/aRNDgw==
|
||||
dependencies:
|
||||
"@ethersproject/abi" "^5.1.2"
|
||||
"@metamask/eth-sig-util" "^4.0.0"
|
||||
|
|
@ -3336,6 +3414,16 @@ https-proxy-agent@^5.0.0:
|
|||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
human-signals@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5"
|
||||
integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==
|
||||
|
||||
husky@^8.0.2:
|
||||
version "8.0.2"
|
||||
resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.2.tgz#5816a60db02650f1f22c8b69b928fd6bcd77a236"
|
||||
integrity sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==
|
||||
|
||||
iconv-lite@0.4.24:
|
||||
version "0.4.24"
|
||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
|
||||
|
|
@ -3394,11 +3482,11 @@ ini@^1.3.5:
|
|||
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
|
||||
|
||||
internal-slot@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
|
||||
integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3"
|
||||
integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==
|
||||
dependencies:
|
||||
get-intrinsic "^1.1.0"
|
||||
get-intrinsic "^1.1.3"
|
||||
has "^1.0.3"
|
||||
side-channel "^1.0.4"
|
||||
|
||||
|
|
@ -3488,6 +3576,11 @@ is-fullwidth-code-point@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
|
||||
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
|
||||
|
||||
is-fullwidth-code-point@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
|
||||
integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
|
||||
|
||||
is-function@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
|
||||
|
|
@ -3549,6 +3642,11 @@ is-shared-array-buffer@^1.0.2:
|
|||
dependencies:
|
||||
call-bind "^1.0.2"
|
||||
|
||||
is-stream@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
|
||||
integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
|
||||
|
||||
is-string@^1.0.5, is-string@^1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
|
||||
|
|
@ -3764,6 +3862,44 @@ levn@~0.3.0:
|
|||
prelude-ls "~1.1.2"
|
||||
type-check "~0.3.2"
|
||||
|
||||
lilconfig@2.0.6:
|
||||
version "2.0.6"
|
||||
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4"
|
||||
integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==
|
||||
|
||||
lint-staged@^13.0.4:
|
||||
version "13.1.0"
|
||||
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.1.0.tgz#d4c61aec939e789e489fa51987ec5207b50fd37e"
|
||||
integrity sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==
|
||||
dependencies:
|
||||
cli-truncate "^3.1.0"
|
||||
colorette "^2.0.19"
|
||||
commander "^9.4.1"
|
||||
debug "^4.3.4"
|
||||
execa "^6.1.0"
|
||||
lilconfig "2.0.6"
|
||||
listr2 "^5.0.5"
|
||||
micromatch "^4.0.5"
|
||||
normalize-path "^3.0.0"
|
||||
object-inspect "^1.12.2"
|
||||
pidtree "^0.6.0"
|
||||
string-argv "^0.3.1"
|
||||
yaml "^2.1.3"
|
||||
|
||||
listr2@^5.0.5:
|
||||
version "5.0.6"
|
||||
resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.6.tgz#3c61153383869ffaad08a8908d63edfde481dff8"
|
||||
integrity sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==
|
||||
dependencies:
|
||||
cli-truncate "^2.1.0"
|
||||
colorette "^2.0.19"
|
||||
log-update "^4.0.0"
|
||||
p-map "^4.0.0"
|
||||
rfdc "^1.3.0"
|
||||
rxjs "^7.5.7"
|
||||
through "^2.3.8"
|
||||
wrap-ansi "^7.0.0"
|
||||
|
||||
locate-path@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
|
||||
|
|
@ -3812,6 +3948,16 @@ log-symbols@4.1.0:
|
|||
chalk "^4.1.0"
|
||||
is-unicode-supported "^0.1.0"
|
||||
|
||||
log-update@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
|
||||
integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
|
||||
dependencies:
|
||||
ansi-escapes "^4.3.0"
|
||||
cli-cursor "^3.1.0"
|
||||
slice-ansi "^4.0.0"
|
||||
wrap-ansi "^6.2.0"
|
||||
|
||||
loupe@^2.3.1:
|
||||
version "2.3.6"
|
||||
resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53"
|
||||
|
|
@ -3901,6 +4047,11 @@ merge-descriptors@1.0.1:
|
|||
resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
|
||||
integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
|
||||
|
||||
merge-stream@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
||||
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
|
||||
|
||||
merge2@^1.2.3, merge2@^1.3.0:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
|
||||
|
|
@ -3911,7 +4062,7 @@ methods@~1.1.2:
|
|||
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
|
||||
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
|
||||
|
||||
micromatch@^4.0.4:
|
||||
micromatch@^4.0.4, micromatch@^4.0.5:
|
||||
version "4.0.5"
|
||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
|
||||
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
|
||||
|
|
@ -3944,6 +4095,16 @@ mime@1.6.0:
|
|||
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
|
||||
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
|
||||
|
||||
mimic-fn@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
|
||||
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
|
||||
|
||||
mimic-fn@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
|
||||
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
|
||||
|
||||
mimic-response@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
|
||||
|
|
@ -3992,7 +4153,7 @@ minimatch@5.0.1:
|
|||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
|
||||
minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7:
|
||||
minimist@^1.2.5, minimist@^1.2.6:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
|
||||
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
|
||||
|
|
@ -4076,9 +4237,9 @@ mocha@7.1.2:
|
|||
yargs-unparser "1.6.0"
|
||||
|
||||
mocha@^10.0.0:
|
||||
version "10.1.0"
|
||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a"
|
||||
integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==
|
||||
version "10.2.0"
|
||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8"
|
||||
integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==
|
||||
dependencies:
|
||||
ansi-colors "4.1.1"
|
||||
browser-stdout "1.3.1"
|
||||
|
|
@ -4295,6 +4456,13 @@ normalize-url@^6.0.1:
|
|||
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
|
||||
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
|
||||
|
||||
npm-run-path@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
|
||||
integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
|
||||
dependencies:
|
||||
path-key "^4.0.0"
|
||||
|
||||
number-to-bn@1.7.0:
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0"
|
||||
|
|
@ -4379,6 +4547,20 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0:
|
|||
dependencies:
|
||||
wrappy "1"
|
||||
|
||||
onetime@^5.1.0:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
|
||||
integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
|
||||
dependencies:
|
||||
mimic-fn "^2.1.0"
|
||||
|
||||
onetime@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
|
||||
integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
|
||||
dependencies:
|
||||
mimic-fn "^4.0.0"
|
||||
|
||||
optionator@^0.8.1:
|
||||
version "0.8.3"
|
||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
|
||||
|
|
@ -4511,6 +4693,16 @@ path-is-absolute@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
|
||||
|
||||
path-key@^3.1.0:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
|
||||
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
|
||||
|
||||
path-key@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
|
||||
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
|
||||
|
||||
path-parse@^1.0.6, path-parse@^1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||
|
|
@ -4552,20 +4744,30 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
|
|||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
|
||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||
|
||||
pidtree@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
|
||||
integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
|
||||
|
||||
pify@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
|
||||
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
|
||||
|
||||
pinst@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/pinst/-/pinst-3.0.0.tgz#80dec0a85f1f993c6084172020f3dbf512897eec"
|
||||
integrity sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw==
|
||||
|
||||
prelude-ls@~1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
||||
integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
|
||||
|
||||
prettier-plugin-solidity@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0.tgz#5b23f48cc9c28a1246c6dd89af117234b813f48b"
|
||||
integrity sha512-gRJCeZ7imbWtNYN2SudjJoPmka5r6jcd2cSTV6FC3pVCtY6LFZbeQQjpKufUEp88hXBAAnkOTOh7TA5xwj9M3A==
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.0.tgz#a417d104b48a43af3adbfb96b65dbce34fd21429"
|
||||
integrity sha512-5gq0T49ifvXH/6x1STuKyWjTUgi6ICoV65yNtKlg/vZEvocFtSpByJOJICBfqPwNsnv4vhhWIqkLGSUJmWum2w==
|
||||
dependencies:
|
||||
"@solidity-parser/parser" "^0.14.5"
|
||||
emoji-regex "^10.2.1"
|
||||
|
|
@ -4868,11 +5070,24 @@ responselike@^2.0.0:
|
|||
dependencies:
|
||||
lowercase-keys "^2.0.0"
|
||||
|
||||
restore-cursor@^3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
|
||||
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
|
||||
dependencies:
|
||||
onetime "^5.1.0"
|
||||
signal-exit "^3.0.2"
|
||||
|
||||
reusify@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
|
||||
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
|
||||
|
||||
rfdc@^1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
|
||||
integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
|
||||
|
||||
rimraf@^2.2.8:
|
||||
version "2.7.1"
|
||||
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
|
||||
|
|
@ -4914,6 +5129,13 @@ rustbn.js@~0.2.0:
|
|||
resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
|
||||
integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
|
||||
|
||||
rxjs@^7.5.7:
|
||||
version "7.6.0"
|
||||
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2"
|
||||
integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==
|
||||
dependencies:
|
||||
tslib "^2.1.0"
|
||||
|
||||
safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
|
||||
version "5.2.1"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
|
||||
|
|
@ -5077,6 +5299,18 @@ sha1@^1.1.1:
|
|||
charenc ">= 0.0.1"
|
||||
crypt ">= 0.0.1"
|
||||
|
||||
shebang-command@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
||||
integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
|
||||
dependencies:
|
||||
shebang-regex "^3.0.0"
|
||||
|
||||
shebang-regex@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
|
||||
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
|
||||
|
||||
shelljs@^0.8.3:
|
||||
version "0.8.5"
|
||||
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
|
||||
|
|
@ -5095,6 +5329,11 @@ side-channel@^1.0.4:
|
|||
get-intrinsic "^1.0.2"
|
||||
object-inspect "^1.9.0"
|
||||
|
||||
signal-exit@^3.0.2, signal-exit@^3.0.7:
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
|
||||
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
|
||||
|
||||
simple-concat@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
|
||||
|
|
@ -5114,6 +5353,15 @@ slash@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
|
||||
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
|
||||
|
||||
slice-ansi@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
|
||||
integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
|
||||
dependencies:
|
||||
ansi-styles "^4.0.0"
|
||||
astral-regex "^2.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
|
||||
slice-ansi@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
|
||||
|
|
@ -5123,6 +5371,14 @@ slice-ansi@^4.0.0:
|
|||
astral-regex "^2.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
|
||||
slice-ansi@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a"
|
||||
integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
|
||||
dependencies:
|
||||
ansi-styles "^6.0.0"
|
||||
is-fullwidth-code-point "^4.0.0"
|
||||
|
||||
solc@0.7.3:
|
||||
version "0.7.3"
|
||||
resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a"
|
||||
|
|
@ -5236,6 +5492,11 @@ strict-uri-encode@^1.0.0:
|
|||
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
|
||||
integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
|
||||
|
||||
string-argv@^0.3.1:
|
||||
version "0.3.1"
|
||||
resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
|
||||
integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
|
||||
|
||||
"string-width@^1.0.2 || 2", string-width@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
|
||||
|
|
@ -5262,7 +5523,16 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
|||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
string.prototype.trimend@^1.0.5:
|
||||
string-width@^5.0.0:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
|
||||
integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
|
||||
dependencies:
|
||||
eastasianwidth "^0.2.0"
|
||||
emoji-regex "^9.2.2"
|
||||
strip-ansi "^7.0.1"
|
||||
|
||||
string.prototype.trimend@^1.0.6:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
|
||||
integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
|
||||
|
|
@ -5271,7 +5541,7 @@ string.prototype.trimend@^1.0.5:
|
|||
define-properties "^1.1.4"
|
||||
es-abstract "^1.20.4"
|
||||
|
||||
string.prototype.trimstart@^1.0.5:
|
||||
string.prototype.trimstart@^1.0.6:
|
||||
version "1.0.6"
|
||||
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
|
||||
integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
|
||||
|
|
@ -5315,6 +5585,18 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
|||
dependencies:
|
||||
ansi-regex "^5.0.1"
|
||||
|
||||
strip-ansi@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
|
||||
integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
|
||||
dependencies:
|
||||
ansi-regex "^6.0.1"
|
||||
|
||||
strip-final-newline@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
|
||||
integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
|
||||
|
||||
strip-hex-prefix@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
|
||||
|
|
@ -5446,6 +5728,11 @@ then-request@^6.0.0:
|
|||
promise "^8.0.0"
|
||||
qs "^6.4.0"
|
||||
|
||||
through@^2.3.8:
|
||||
version "2.3.8"
|
||||
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
|
||||
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
|
||||
|
||||
timed-out@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
|
||||
|
|
@ -5507,6 +5794,11 @@ tslib@^1.9.3:
|
|||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
|
||||
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
|
||||
|
||||
tslib@^2.1.0:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
|
||||
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
|
||||
|
||||
tsort@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786"
|
||||
|
|
@ -5587,9 +5879,9 @@ typedarray@^0.0.6:
|
|||
integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
|
||||
|
||||
typescript@^4.9.3:
|
||||
version "4.9.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db"
|
||||
integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==
|
||||
version "4.9.4"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78"
|
||||
integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==
|
||||
|
||||
uglify-js@^3.1.4:
|
||||
version "3.17.4"
|
||||
|
|
@ -5612,9 +5904,9 @@ unbox-primitive@^1.0.2:
|
|||
which-boxed-primitive "^1.0.2"
|
||||
|
||||
undici@^5.4.0:
|
||||
version "5.13.0"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-5.13.0.tgz#56772fba89d8b25e39bddc8c26a438bd73ea69bb"
|
||||
integrity sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q==
|
||||
version "5.14.0"
|
||||
resolved "https://registry.yarnpkg.com/undici/-/undici-5.14.0.tgz#1169d0cdee06a4ffdd30810f6228d57998884d00"
|
||||
integrity sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==
|
||||
dependencies:
|
||||
busboy "^1.6.0"
|
||||
|
||||
|
|
@ -6012,6 +6304,13 @@ which@1.3.1, which@^1.1.1, which@^1.3.1:
|
|||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
which@^2.0.1:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
|
||||
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
|
||||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
wide-align@1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
|
||||
|
|
@ -6043,6 +6342,15 @@ wrap-ansi@^5.1.0:
|
|||
string-width "^3.0.0"
|
||||
strip-ansi "^5.0.0"
|
||||
|
||||
wrap-ansi@^6.2.0:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
|
||||
integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
|
||||
dependencies:
|
||||
ansi-styles "^4.0.0"
|
||||
string-width "^4.1.0"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
wrap-ansi@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
|
|
@ -6141,6 +6449,11 @@ yallist@^4.0.0:
|
|||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yaml@^2.1.3:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207"
|
||||
integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==
|
||||
|
||||
yargs-parser@13.1.2, yargs-parser@^13.1.2:
|
||||
version "13.1.2"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
|
||||
|
|
|
|||
Loading…
Reference in New Issue