├── next-client
├── .env.development
├── .eslintrc.json
├── .env.production
├── public
│ ├── logo.webp
│ ├── favicon.ico
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── apple-touch-icon.png
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ └── manifest.json
├── .env
├── pages
│ ├── api
│ │ └── hello.js
│ ├── _app.js
│ ├── profil.js
│ ├── index.js
│ ├── owner.js
│ ├── _document.js
│ ├── cart.js
│ └── order.js
├── next.config.js
├── components
│ ├── layout.js
│ ├── hero.js
│ ├── footer.js
│ ├── products.js
│ ├── productCard.js
│ ├── order
│ │ └── payment.js
│ ├── storeCart.js
│ ├── appbar.js
│ └── header.js
├── services
│ ├── product.js
│ └── order.js
├── app
│ └── store.js
├── .gitignore
├── styles
│ ├── hero.module.css
│ ├── globals.css
│ ├── footer.module.css
│ ├── productCard.module.css
│ ├── cart.module.css
│ ├── header.module.css
│ ├── order.module.css
│ └── store.cart.module.css
├── reducers
│ ├── wallet.js
│ └── cart.js
├── package.json
├── constants
│ └── abi.js
└── README.md
├── Dockerfile
├── express-server
├── .env.example
├── models
│ ├── product.js
│ └── order.js
├── utils
│ ├── config.js
│ ├── mongo.js
│ └── middleware.js
├── .gitignore
├── package.json
├── routers
│ ├── product.js
│ └── order.js
├── index.js
├── constants
│ └── abi.js
└── yarn.lock
├── .github
└── workflows
│ └── docker-image.yml
├── README.md
├── scripts
└── docker-compose.yaml
├── Contract
└── Payment.sol
└── LICENSE
/next-client/.env.development:
--------------------------------------------------------------------------------
1 | NEXT_PUBLIC_API_URL=http://localhost:4000/api/
--------------------------------------------------------------------------------
/next-client/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/next-client/.env.production:
--------------------------------------------------------------------------------
1 | NEXT_PUBLIC_API_URL=https://web3payment.herokuapp.com/api/
--------------------------------------------------------------------------------
/next-client/public/logo.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmBayus/Web3-Shopping-Cart/HEAD/next-client/public/logo.webp
--------------------------------------------------------------------------------
/next-client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmBayus/Web3-Shopping-Cart/HEAD/next-client/public/favicon.ico
--------------------------------------------------------------------------------
/next-client/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmBayus/Web3-Shopping-Cart/HEAD/next-client/public/favicon-16x16.png
--------------------------------------------------------------------------------
/next-client/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmBayus/Web3-Shopping-Cart/HEAD/next-client/public/favicon-32x32.png
--------------------------------------------------------------------------------
/next-client/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmBayus/Web3-Shopping-Cart/HEAD/next-client/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/next-client/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmBayus/Web3-Shopping-Cart/HEAD/next-client/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/next-client/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmBayus/Web3-Shopping-Cart/HEAD/next-client/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/next-client/.env:
--------------------------------------------------------------------------------
1 | NEXT_PUBLIC_RPC_URL=https://bsc-dataseed.binance.org/
2 | NEXT_PUBLIC_CONTRACT=0x2fF7aDa379712E772c9A8F0eb37C836Ded11006E
3 | NEXT_PUBLIC_CHAIN=56
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node
2 |
3 | EXPOSE 80
4 |
5 | WORKDIR /usr/src/app
6 |
7 | COPY ./express-server/ .
8 | RUN npm install
9 |
10 | ENTRYPOINT ["npm", "start"]
11 |
--------------------------------------------------------------------------------
/next-client/pages/api/hello.js:
--------------------------------------------------------------------------------
1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction
2 |
3 | export default function handler(req, res) {
4 | res.status(200).json({ name: 'John Doe' })
5 | }
6 |
--------------------------------------------------------------------------------
/express-server/.env.example:
--------------------------------------------------------------------------------
1 | PORT=4000
2 | MONGODB_URI=mongodb://localhost:27017/testweb3
3 | SESSION_SECRET=secret
4 | CHAIN_URL=https://bsc-dataseed.binance.org/
5 | CONTRACT_ADDRESS=0x2fF7aDa379712E772c9A8F0eb37C836Ded11006E
--------------------------------------------------------------------------------
/next-client/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | reactStrictMode: true,
4 | images: {
5 | domains: ["img.freepik.com","picsum.photos"],
6 | },
7 | };
8 |
9 | module.exports = nextConfig;
10 |
--------------------------------------------------------------------------------
/next-client/components/layout.js:
--------------------------------------------------------------------------------
1 | import Header from './header'
2 | import Footer from './footer'
3 |
4 | export default function Layout({ children }) {
5 | return (
6 | <>
7 |
8 | {children}
9 |
10 | >
11 | )
12 | }
--------------------------------------------------------------------------------
/express-server/models/product.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose')
2 |
3 | const productSchema = new mongoose.Schema({
4 | name:String,
5 | price:Number,
6 | img:String,
7 | description:String,
8 | })
9 |
10 | module.exports = mongoose.model('product', productSchema)
--------------------------------------------------------------------------------
/next-client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
--------------------------------------------------------------------------------
/next-client/services/product.js:
--------------------------------------------------------------------------------
1 | import axios from "axios"
2 |
3 | const url = process.env.NEXT_PUBLIC_API_URL + "product/"
4 |
5 | const getAll = ()=>{
6 | return axios.get(url+"getAll")
7 | }
8 |
9 | const add = (body)=>{
10 | return axios.post(url+"add",body)
11 | }
12 |
13 |
14 | const service = {getAll,add}
15 |
16 | export default service
--------------------------------------------------------------------------------
/express-server/utils/config.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config()
2 |
3 | const MONGODB_URI = process.env.MONGODB_URI
4 | const SESSION_SECRET = process.env.SESSION_SECRET
5 | const CHAIN_URL = process.env.CHAIN_URL
6 | const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS
7 |
8 |
9 | module.exports = {
10 | MONGODB_URI,
11 | SESSION_SECRET,
12 | CHAIN_URL,
13 | CONTRACT_ADDRESS
14 | }
--------------------------------------------------------------------------------
/next-client/components/hero.js:
--------------------------------------------------------------------------------
1 | import {Zoom} from "react-awesome-reveal";
2 | import styles from "../styles/hero.module.css";
3 |
4 | export default function Hero({header,description}){
5 | return (
6 |
7 |
8 |
9 |
{header}
10 | {description}
11 |
12 |
13 |
14 | );
15 | };
--------------------------------------------------------------------------------
/express-server/utils/mongo.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose')
2 | const { MONGODB_URI } = require("./config")
3 |
4 | console.log('connecting to', MONGODB_URI)
5 |
6 | mongoose.connect(MONGODB_URI)
7 | .then(result => {
8 | console.log('connected to MongoDB')
9 | })
10 | .catch((error) => {
11 | console.log('error connecting to MongoDB:', error.message)
12 | })
13 |
14 | module.exports = mongoose
--------------------------------------------------------------------------------
/next-client/pages/_app.js:
--------------------------------------------------------------------------------
1 | import "../styles/globals.css";
2 | import Layout from "../components/layout";
3 | import store from "../app/store";
4 | import { Provider } from "react-redux";
5 |
6 | export default function MyApp({ Component, pageProps }) {
7 | return (
8 |
9 |
10 |
11 |
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/next-client/app/store.js:
--------------------------------------------------------------------------------
1 | import {
2 | configureStore,
3 | } from '@reduxjs/toolkit'
4 | import cartReducer from '../reducers/cart'
5 | import walletReducer from '../reducers/wallet'
6 |
7 | export default configureStore({
8 | reducer: {
9 | cart:cartReducer,
10 | wallet:walletReducer
11 | },
12 | middleware: getDefaultMiddleware =>
13 | getDefaultMiddleware({
14 | serializableCheck: false,
15 | }),
16 | })
--------------------------------------------------------------------------------
/express-server/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env
17 | .env.local
18 | .env.development.local
19 | .env.test.local
20 | .env.production.local
21 |
22 | npm-debug.log*
23 | yarn-debug.log*
24 | yarn-error.log*
25 |
--------------------------------------------------------------------------------
/next-client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 | .pnpm-debug.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
--------------------------------------------------------------------------------
/next-client/styles/hero.module.css:
--------------------------------------------------------------------------------
1 | .hero{
2 | display: flex;
3 | justify-content: center;
4 | align-items: center;
5 | text-align: center;
6 | padding-top: 0.6em;
7 | padding-bottom: 3em;
8 | font-family: 'Roboto Slab', serif;
9 | line-height: 0.3em;
10 | }
11 |
12 | .hero h3{
13 | font-family: 'Roboto Slab', serif;
14 | font-size: 3rem;
15 | font-weight: 700;
16 | }
17 |
18 | .hero span{
19 | font-size: 1rem;
20 | color: rgb(140, 138, 138);
21 | font-weight: 300;
22 | }
--------------------------------------------------------------------------------
/.github/workflows/docker-image.yml:
--------------------------------------------------------------------------------
1 | name: Docker Image CI
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 |
8 | jobs:
9 | build:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: actions/checkout@v2
13 |
14 | - name: Push to Heroku
15 | uses: akhileshns/heroku-deploy@v3.12.12 # This is the action
16 | with:
17 | heroku_api_key: ${{secrets.HEROKU_API_KEY}}
18 | heroku_app_name: web3payment
19 | heroku_email: omerbayramcavus@gmail.com
20 | usedocker: true
21 |
--------------------------------------------------------------------------------
/express-server/models/order.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose')
2 |
3 | const orderSchema = new mongoose.Schema({
4 | products:[
5 | {
6 | product: {
7 | type:mongoose.Schema.Types.ObjectId,
8 | ref:"product",
9 | require:true
10 | },
11 | quantity: Number,
12 | }
13 | ],
14 | email:String,
15 | receiver:String,
16 | isPaid:Boolean,
17 | price: Number
18 | })
19 |
20 | module.exports = mongoose.model('order', orderSchema)
--------------------------------------------------------------------------------
/next-client/styles/globals.css:
--------------------------------------------------------------------------------
1 | html,
2 | body {
3 | padding: 0;
4 | margin: 0;
5 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu,
6 | Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
7 | min-height: 100vh;
8 | width: 100%;
9 | overflow-x: hidden;
10 | }
11 |
12 | a {
13 | color: inherit;
14 | text-decoration: none;
15 | }
16 |
17 | * {
18 | box-sizing: border-box;
19 | }
20 |
21 | @media (max-width: 768px) {
22 | .card-md-dis{
23 | display: block!important;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/express-server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "cors": "^2.8.5",
4 | "dotenv": "^16.0.1",
5 | "ethers": "^5.6.9",
6 | "express": "^4.18.1",
7 | "helmet": "^5.1.0",
8 | "jsonwebtoken": "^8.5.1",
9 | "mongoose": "^6.4.0"
10 | },
11 | "name": "express-server",
12 | "version": "1.0.0",
13 | "main": "index.js",
14 | "devDependencies": {},
15 | "scripts": {
16 | "start": "node index.js",
17 | "dev": "nodemon index.js"
18 | },
19 | "keywords": [],
20 | "author": "",
21 | "license": "ISC",
22 | "description": ""
23 | }
24 |
--------------------------------------------------------------------------------
/next-client/services/order.js:
--------------------------------------------------------------------------------
1 | import axios from "axios"
2 |
3 | const url = process.env.NEXT_PUBLIC_API_URL + "order/"
4 |
5 |
6 | const create = (body)=>{
7 | return axios.post(url+"create",body)
8 | }
9 |
10 | const pay = (id,receiver)=>{
11 | return axios.post(url+"pay",{id,receiver})
12 | }
13 |
14 | const get = (id)=>{
15 | return axios.get(url+"get/"+id)
16 | }
17 |
18 | const getByAddress = (address)=>{
19 | return axios.get(url+"getByAddress/"+address)
20 | }
21 |
22 |
23 |
24 | const service = {create,pay,get,getByAddress}
25 |
26 | export default service
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Web3 Shopping Cart in BSC 🛍️
2 | ### https://web3-shopping-cart.vercel.app/
3 |
4 | ## Preview
5 |
6 |
7 |
8 |
9 | ## Technologies used:
10 |
11 | * React
12 | * Nextjs
13 | * Material UI
14 | * Ethersjs
15 | * walletconnect
16 | * web3modal
17 | * Redux Toolkit
18 | * Express
19 | * Mongodb
20 |
21 | ### License & copyright
22 |
23 | Copyright (c) 2022 Omer Bayramcavus
24 |
25 | Licensed under the [MIT License](LICENSE).
26 |
--------------------------------------------------------------------------------
/next-client/styles/footer.module.css:
--------------------------------------------------------------------------------
1 | .footer{
2 | display: flex;
3 | justify-content: center;
4 | align-items: center;
5 | flex-direction: column;
6 | gap: 0.5rem;
7 | padding-top: 4rem;
8 | padding-bottom: 2rem;
9 | color: rgb(177, 177, 177);
10 | }
11 |
12 | .footer a{
13 | display: flex;
14 | justify-content: center;
15 | align-items: center;
16 | font-size:1em;
17 | transition: all 0.3s ease-in-out;
18 | }
19 |
20 | .footer a span{
21 | margin-left: 5px;
22 | }
23 |
24 | .footer a:hover{
25 | color: rgba(177, 177, 177, 0.439);
26 | }
27 |
28 | .icon{
29 | font-size: 1.4em;
30 | }
--------------------------------------------------------------------------------
/scripts/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: "3.8"
2 | services:
3 | mongo:
4 | image: mongo
5 | container_name: mongodb
6 | ports:
7 | - 27017:27017
8 | volumes:
9 | - data:/data/db
10 | environment:
11 | - MONGO_INITDB_DATABASE=test
12 | mongo-express:
13 |
14 | image: mongo-express
15 | container_name: mongo-express
16 | restart: always
17 | ports:
18 | - 8081:8081
19 | environment:
20 | - ME_CONFIG_MONGODB_SERVER=mongo
21 | - ME_CONFIG_BASICAUTH_USERNAME=admin
22 | - ME_CONFIG_BASICAUTH_PASSWORD=adminpass
23 | volumes:
24 | data: {}
25 |
26 | networks:
27 | default:
28 | name: mongodb_network
--------------------------------------------------------------------------------
/next-client/components/footer.js:
--------------------------------------------------------------------------------
1 | import styles from "../styles/footer.module.css"
2 | import GitHubIcon from '@mui/icons-material/GitHub';
3 | import ReceiptIcon from '@mui/icons-material/Receipt';
4 |
5 | const Footer = ()=>{
6 | return(
7 |
12 | )
13 | }
14 |
15 | export default Footer
16 |
--------------------------------------------------------------------------------
/next-client/components/products.js:
--------------------------------------------------------------------------------
1 | import { Button, Container } from "@mui/material";
2 | import ProductCard from "./productCard";
3 | import Grid from "@mui/material/Grid";
4 | import { useDispatch } from 'react-redux'
5 | import {add} from "../reducers/cart"
6 |
7 | export default function Products({products}) {
8 | const dispatch = useDispatch()
9 |
10 | const addToCart = (id,item) =>{
11 | dispatch(add({product:id,data:item, price:products.find(it=>it._id===id).price}))
12 | }
13 | return (
14 |
15 |
16 | {products.map((item) => (
17 |
18 | addToCart(item._id,item)} />
19 |
20 | ))}
21 |
22 |
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/next-client/reducers/wallet.js:
--------------------------------------------------------------------------------
1 | import { createSlice } from "@reduxjs/toolkit";
2 |
3 | const initialState = {
4 | value: {
5 | connected: false,
6 | chainId: 0,
7 | signer: {},
8 | },
9 | };
10 |
11 | export const walletSlice = createSlice({
12 | name: "wallet",
13 | initialState,
14 | reducers: {
15 | connect: (state, action) => {
16 | state.value.connected = true;
17 | state.value.chainId = action.payload.chainId;
18 | state.value.signer = action.payload.signer;
19 | },
20 | disconnect: (state) => {
21 | state.value.connected = false;
22 | state.value.chainId = 0;
23 | state.value.signer = {};
24 | },
25 | },
26 | });
27 |
28 | // Action creators are generated for each case reducer function
29 | export const { connect,disconnect } = walletSlice.actions;
30 |
31 | export default walletSlice.reducer;
32 |
--------------------------------------------------------------------------------
/next-client/styles/productCard.module.css:
--------------------------------------------------------------------------------
1 | .cardImage{
2 | width:100%;
3 | display: flex;
4 | justify-content: center;
5 | align-items: center;
6 | padding-top: 20px;
7 | padding-bottom: 40px;
8 | }
9 |
10 | .cardImage img{
11 | width: 100px;
12 | height: 100px;
13 | border-radius: 40%;
14 | }
15 |
16 | .cardBtn{
17 | width: 100%!important;
18 | display: flex!important;
19 | justify-content: center!important;
20 | align-items: center!important;
21 | margin: 20px 5px!important;
22 | border-radius:50px!important;
23 | padding: 10px 25px!important;
24 | background: black!important;
25 | transition: .125s ease!important;
26 | }
27 |
28 | .cardBtn:hover{
29 | transform: scale(1.025)!important;
30 | background: #141414!important;
31 | }
32 |
33 | .cardBtn:active{
34 | transform: scale(0.99)!important;
35 | }
--------------------------------------------------------------------------------
/express-server/routers/product.js:
--------------------------------------------------------------------------------
1 | const router = require("express").Router();
2 | const Order = require("../models/order");
3 | const Product = require("../models/product");
4 | // const {authExactor} = require("../utils/middleware")
5 |
6 | // router.use(authExactor)
7 |
8 | router.get("/getAll", (req, res) => {
9 | Product.find({}, (err, products) => {
10 | if (err) {
11 | res.status(500).json(err);
12 | }
13 | res.json(products);
14 | })
15 | });
16 |
17 | router.post("/add", async (req, res) => {
18 | const {name, price,img, description} = req.body;
19 | const product = new Product({name, price,img, description});
20 | product.save()
21 | .then(result=>{
22 | res.json(result);
23 | })
24 | .catch(err=>{
25 | res.status(500).json(err);
26 | })
27 | });
28 |
29 |
30 |
31 | module.exports = router;
32 |
--------------------------------------------------------------------------------
/Contract/Payment.sol:
--------------------------------------------------------------------------------
1 | // SPDX-License-Identifier: MIT
2 | pragma solidity 0.8.7;
3 |
4 | contract Payment{
5 |
6 | mapping(string=>uint256) public orderToAmountPaid;
7 | address payable immutable owner;
8 |
9 | constructor() {
10 | owner = payable(msg.sender);
11 | }
12 |
13 | function pay (string memory _order) payable public{
14 | owner.transfer(msg.value);
15 | orderToAmountPaid[_order] = msg.value;
16 | }
17 |
18 | function getOrder (string memory _order) public view returns(uint256){
19 | return orderToAmountPaid[_order];
20 | }
21 |
22 | modifier onlyOwner() {
23 | require(msg.sender == owner);
24 | _;
25 | }
26 |
27 | receive() external payable {
28 | owner.transfer(msg.value);
29 | }
30 |
31 | fallback() external payable{
32 | owner.transfer(msg.value);
33 | }
34 |
35 |
36 | }
--------------------------------------------------------------------------------
/next-client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@emotion/react": "^11.9.3",
13 | "@emotion/styled": "^11.9.3",
14 | "@mui/icons-material": "^5.8.4",
15 | "@mui/lab": "^5.0.0-alpha.89",
16 | "@mui/material": "^5.8.6",
17 | "@reduxjs/toolkit": "^1.8.3",
18 | "@walletconnect/web3-provider": "^1.7.8",
19 | "axios": "^0.27.2",
20 | "ethers": "^5.6.9",
21 | "next": "12.1.6",
22 | "react": "18.2.0",
23 | "react-awesome-reveal": "^3.8.1",
24 | "react-dom": "18.2.0",
25 | "react-redux": "^8.0.2",
26 | "web3modal": "^1.9.8"
27 | },
28 | "devDependencies": {
29 | "eslint": "8.18.0",
30 | "eslint-config-next": "12.1.6"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/next-client/pages/profil.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { useRouter } from "next/router";
3 | import OrderService from "../services/order";
4 |
5 | function Profil({ query }) {
6 | const router = useRouter();
7 | const [data, setData] = React.useState([]);
8 | React.useEffect(() => {
9 | if (!query.address) {
10 | router.push("/");
11 | } else {
12 | OrderService.getByAddress(query.address)
13 | .then((res) => {
14 | if (res.data) {
15 | setData(res.data);
16 | }
17 | }, [])
18 | .catch((err) => {
19 | alert("Error");
20 | router.push("/");
21 | });
22 | }
23 | // eslint-disable-next-line react-hooks/exhaustive-deps
24 | }, []);
25 |
26 | return {JSON.stringify(data)}
;
27 | }
28 |
29 | Profil.getInitialProps = ({ query }) => {
30 | return { query };
31 | };
32 |
33 | export default Profil;
34 |
--------------------------------------------------------------------------------
/express-server/utils/middleware.js:
--------------------------------------------------------------------------------
1 | const jwt = require("jsonwebtoken");
2 | const { SESSION_SECRET } = require("./config");
3 |
4 | const unknownEndpoint = (request, response) => {
5 | response.status(404).send({ error: "unknown endpoint" });
6 | };
7 |
8 | const errorHandler = (error, request, response, next) => {
9 | console.log(error.message);
10 |
11 | if (error.name === "CastError" && error.kind == "ObjectId") {
12 | return response.status(400).send({ error: "malformatted id" });
13 | }
14 |
15 | next(error);
16 | };
17 |
18 | const authExactor = (req, res, next) => {
19 | const token = req.body.token || req.query.token;
20 |
21 | try {
22 | if (token) {
23 | const user = jwt.verify(token, SESSION_SECRET);
24 |
25 | if (!user) {
26 | res.json({ error: "You need to sign in" });
27 | } else {
28 | next();
29 | }
30 | } else {
31 | res.json({ error: "You need to sign in" });
32 | }
33 | } catch (error) {
34 | res.json({ error: "You need to sign in" });
35 | }
36 | };
37 |
38 | module.exports = { errorHandler, unknownEndpoint, authExactor };
39 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Omer Bayramcavus
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/next-client/pages/index.js:
--------------------------------------------------------------------------------
1 | import { useEffect,useState } from "react";
2 | import Hero from "../components/hero";
3 | import Products from "../components/products";
4 | import StoreCart from "../components/storeCart";
5 | import ProductService from "../services/product";
6 |
7 | export default function Home({ staticProducts }) {
8 | const [products, setProducts] = useState(staticProducts)
9 | const getProducts = async () => {
10 | try {
11 | const res = await ProductService.getAll();
12 | setProducts(res.data);
13 | } catch (err) {
14 | console.log(err);
15 | }
16 | };
17 | useEffect(()=>{
18 | getProducts()
19 | },[])
20 | return (
21 | <>
22 |
23 |
24 |
25 | >
26 | );
27 | }
28 |
29 | export async function getStaticProps() {
30 | try {
31 | const res = await ProductService.getAll();
32 | return {
33 | props: {
34 | staticProducts: res.data || [],
35 | },
36 | };
37 | } catch (err) {
38 | return {
39 | props: {
40 | staticProducts: [],
41 | },
42 | };
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/express-server/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const cors = require("cors");
3 | const helmet = require("helmet");
4 |
5 | const app = express();
6 |
7 | //routers
8 | const productRouter = require("./routers/product");
9 | const orderRouter = require("./routers/order");
10 |
11 | const middleware = require("./utils/middleware");
12 |
13 | app.use(helmet());
14 |
15 | if (process.env.NODE_ENV === "production") {
16 | app.set("trust proxy", 1);
17 | // app.enable('trust proxy');
18 | }
19 |
20 | app.use(
21 | cors({
22 | // origin: process.env.NODE_ENV !== "production" ? ['http://localhost:3000']: ['https://www.ombayus.com'],
23 | // credentials: true
24 | })
25 | );
26 |
27 | app.use(express.json());
28 |
29 | // app.use(express.static('build'))
30 |
31 | //connect database
32 | require("./utils/mongo");
33 |
34 | app.get("/", (req, res) => {
35 | res.send("Web3 Shopping Cart");
36 | });
37 |
38 | //using outers
39 | app.use("/api/order", orderRouter);
40 | app.use("/api/product", productRouter);
41 |
42 | app.use(middleware.unknownEndpoint);
43 |
44 | app.use(middleware.errorHandler);
45 |
46 | const PORT = process.env.PORT || 80;
47 |
48 | app.listen(PORT, () => {
49 | console.log("listening the server on " + PORT);
50 | });
51 |
--------------------------------------------------------------------------------
/next-client/styles/cart.module.css:
--------------------------------------------------------------------------------
1 | .card {
2 | background: white;
3 | text-align: center;
4 | border-radius: 15px;
5 | padding: 5px 20px;
6 | box-shadow: 0px 2px 1px -1px rgb(0 0 0 / 20%),
7 | 0px 1px 1px 0px rgb(0 0 0 / 14%), 0px 1px 3px 0px rgb(0 0 0 / 12%);
8 | }
9 |
10 | .item {
11 | background: rgba(0, 0, 0, 0.053);
12 | border-radius: 10px;
13 | margin: 10px 0;
14 | padding: 10px;
15 | display: flex;
16 | justify-content: space-between;
17 | align-items: center;
18 | }
19 |
20 | .item img {
21 | width: 50px;
22 | height: 50px;
23 | border-radius: 40%;
24 | }
25 |
26 | .btn {
27 | background: #0e76fd!important;
28 | color: #fff!important;
29 | padding: 9px 16px!important;
30 | font-weight: 700!important;
31 | cursor: pointer!important;
32 | border: 0!important;
33 | box-sizing: border-box!important;
34 | font-size: 100%!important;
35 | line-height: normal!important;
36 | margin: 0!important;
37 | vertical-align: baseline!important;
38 | -webkit-tap-highlight-color: transparent!important;
39 | -webkit-appearance: button!important;
40 | text-transform: none!important;
41 | box-shadow: none!important;
42 | transition: .125s ease;
43 | }
44 |
45 | .btn:hover{
46 | transform: scale(1.025)!important;
47 | }
48 |
49 | .btn:active{
50 | transform: scale(0.95)!important;
51 | }
--------------------------------------------------------------------------------
/express-server/constants/abi.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | abi: [
3 | {
4 | "inputs": [],
5 | "stateMutability": "nonpayable",
6 | "type": "constructor"
7 | },
8 | {
9 | "stateMutability": "payable",
10 | "type": "fallback"
11 | },
12 | {
13 | "inputs": [
14 | {
15 | "internalType": "string",
16 | "name": "_order",
17 | "type": "string"
18 | }
19 | ],
20 | "name": "getOrder",
21 | "outputs": [
22 | {
23 | "internalType": "uint256",
24 | "name": "",
25 | "type": "uint256"
26 | }
27 | ],
28 | "stateMutability": "view",
29 | "type": "function"
30 | },
31 | {
32 | "inputs": [
33 | {
34 | "internalType": "string",
35 | "name": "",
36 | "type": "string"
37 | }
38 | ],
39 | "name": "orderToAmountPaid",
40 | "outputs": [
41 | {
42 | "internalType": "uint256",
43 | "name": "",
44 | "type": "uint256"
45 | }
46 | ],
47 | "stateMutability": "view",
48 | "type": "function"
49 | },
50 | {
51 | "inputs": [
52 | {
53 | "internalType": "string",
54 | "name": "_order",
55 | "type": "string"
56 | }
57 | ],
58 | "name": "pay",
59 | "outputs": [],
60 | "stateMutability": "payable",
61 | "type": "function"
62 | },
63 | {
64 | "stateMutability": "payable",
65 | "type": "receive"
66 | }
67 | ],
68 | };
--------------------------------------------------------------------------------
/next-client/constants/abi.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | abi: [
3 | {
4 | "inputs": [],
5 | "stateMutability": "nonpayable",
6 | "type": "constructor"
7 | },
8 | {
9 | "stateMutability": "payable",
10 | "type": "fallback"
11 | },
12 | {
13 | "inputs": [
14 | {
15 | "internalType": "string",
16 | "name": "_order",
17 | "type": "string"
18 | }
19 | ],
20 | "name": "getOrder",
21 | "outputs": [
22 | {
23 | "internalType": "uint256",
24 | "name": "",
25 | "type": "uint256"
26 | }
27 | ],
28 | "stateMutability": "view",
29 | "type": "function"
30 | },
31 | {
32 | "inputs": [
33 | {
34 | "internalType": "string",
35 | "name": "",
36 | "type": "string"
37 | }
38 | ],
39 | "name": "orderToAmountPaid",
40 | "outputs": [
41 | {
42 | "internalType": "uint256",
43 | "name": "",
44 | "type": "uint256"
45 | }
46 | ],
47 | "stateMutability": "view",
48 | "type": "function"
49 | },
50 | {
51 | "inputs": [
52 | {
53 | "internalType": "string",
54 | "name": "_order",
55 | "type": "string"
56 | }
57 | ],
58 | "name": "pay",
59 | "outputs": [],
60 | "stateMutability": "payable",
61 | "type": "function"
62 | },
63 | {
64 | "stateMutability": "payable",
65 | "type": "receive"
66 | }
67 | ],
68 | };
--------------------------------------------------------------------------------
/next-client/styles/header.module.css:
--------------------------------------------------------------------------------
1 | .header{
2 | display: flex;
3 | justify-content: space-between;
4 | align-items: center;
5 | flex-direction: row;
6 | padding: 1.5rem;
7 | gap: 0.5rem;
8 | }
9 |
10 | .connectBtn{
11 | background: #0E76FD;
12 | color: #fff;
13 | padding: 10px 14px;
14 | font-weight: 700;
15 | border-radius: 12px;
16 | cursor: pointer;
17 | border: 0;
18 | box-sizing: border-box;
19 | font-size: 100%;
20 | line-height: normal;
21 | margin: 0;
22 | text-align: left;
23 | vertical-align: baseline;
24 | -webkit-tap-highlight-color: transparent;
25 | -webkit-appearance: button;
26 | text-transform: none;
27 | transition: .125s ease;
28 | }
29 |
30 | .connectBtn:hover{
31 | transform: scale(1.025);
32 | }
33 |
34 | .connectBtn:active{
35 | transform: scale(0.95);
36 | }
37 |
38 |
39 | .logo{
40 | display: flex;
41 | line-height: 2rem;
42 | font-weight: 700;
43 | font-size: 1.5rem;
44 | color: rgb(31, 41, 55);
45 | justify-content: center;
46 | align-items: center;
47 | flex-direction: row;
48 | cursor: pointer;
49 | }
50 |
51 | .logo img{
52 | /* padding: 0.6rem; */
53 | margin: 0 1em;
54 | max-height: 3rem;
55 | max-width: 100%;
56 | height: auto;
57 | }
58 |
59 | .logo span{
60 | display: flex;
61 | }
62 |
63 |
--------------------------------------------------------------------------------
/next-client/styles/order.module.css:
--------------------------------------------------------------------------------
1 | .card {
2 | background: white;
3 | text-align: center;
4 | border-radius: 15px;
5 | padding: 5px 20px;
6 | box-shadow: 0px 2px 1px -1px rgb(0 0 0 / 20%),
7 | 0px 1px 1px 0px rgb(0 0 0 / 14%), 0px 1px 3px 0px rgb(0 0 0 / 12%);
8 | }
9 |
10 | .item {
11 | background: rgba(0, 0, 0, 0.053);
12 | border-radius: 10px;
13 | margin: 10px 0;
14 | padding: 10px;
15 | display: flex;
16 | justify-content: space-between;
17 | align-items: center;
18 | }
19 |
20 | .item img {
21 | width: 50px;
22 | height: 50px;
23 | border-radius: 40%;
24 | }
25 |
26 | .btn {
27 | background: #0e76fd!important;
28 | color: #fff !important;
29 | border-radius: 12px;
30 | padding: 9px 16px !important;
31 | width: 80%;
32 | font-weight: 700 !important;
33 | cursor: pointer !important;
34 | border: 0 !important;
35 | box-sizing: border-box !important;
36 | font-size: 100% !important;
37 | line-height: normal !important;
38 | margin: 0 !important;
39 | vertical-align: baseline !important;
40 | -webkit-tap-highlight-color: transparent !important;
41 | -webkit-appearance: button !important;
42 | text-transform: none !important;
43 | box-shadow: none !important;
44 | transition: 0.125s ease;
45 | }
46 |
47 | .btn:hover {
48 | transform: scale(1.025) !important;
49 | }
50 |
51 | .btn:active {
52 | transform: scale(0.95) !important;
53 | }
54 |
--------------------------------------------------------------------------------
/next-client/components/productCard.js:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import Card from "@mui/material/Card";
3 | import CardActions from "@mui/material/CardActions";
4 | import CardContent from "@mui/material/CardContent";
5 | import Button from "@mui/material/Button";
6 | import Typography from "@mui/material/Typography";
7 | import styles from "../styles/productCard.module.css";
8 |
9 | export default function BasicCard({ name, price,img, description, add }) {
10 | return (
11 |
12 |
13 | {/* eslint-disable-next-line @next/next/no-img-element */}
14 |

15 |
16 |
17 |
18 | {name}
19 |
20 |
21 | {price} BNB
22 |
23 | {description}
24 |
25 |
26 |
29 |
30 |
31 | );
32 | }
33 |
--------------------------------------------------------------------------------
/next-client/reducers/cart.js:
--------------------------------------------------------------------------------
1 | import { createSlice } from "@reduxjs/toolkit";
2 |
3 | const initialState = {
4 | value: {
5 | products: [],
6 | price: 0,
7 | },
8 | };
9 |
10 | export const cartSlice = createSlice({
11 | name: "cart",
12 | initialState,
13 | reducers: {
14 | add: (state, action) => {
15 | const findProduct = state.value.products.find(item=>item.product === action.payload.product)
16 | if(findProduct){
17 | findProduct.quantity += 1
18 | }
19 | else{
20 | state.value.products.push({
21 | product: action.payload.product,
22 | data: action.payload.data,
23 | quantity: 1
24 | })
25 | }
26 | state.value.price += action.payload.price;
27 | },
28 | remove: (state, action) => {
29 | const findProduct = state.value.products.find(item=>item.product === action.payload.product)
30 | if(findProduct.quantity > 1){
31 | findProduct.quantity -= 1
32 | }
33 | else{
34 | state.value.products = state.value.products.filter(item=>item.product !== action.payload.product)
35 | }
36 | state.value.price -= action.payload.price;
37 | if(state.value.products.length === 0){
38 | state.value.price = 0
39 | }
40 | },
41 | clear: (state) => {
42 | state.value.products = [];
43 | state.value.price = 0;
44 | },
45 | },
46 | });
47 |
48 | // Action creators are generated for each case reducer function
49 | export const { add, remove, clear } = cartSlice.actions;
50 |
51 | export default cartSlice.reducer;
52 |
--------------------------------------------------------------------------------
/next-client/README.md:
--------------------------------------------------------------------------------
1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | ```
12 |
13 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
14 |
15 | You can start editing the page by modifying `pages/index.js`. The page auto-updates as you edit the file.
16 |
17 | [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.js`.
18 |
19 | The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
20 |
21 | ## Learn More
22 |
23 | To learn more about Next.js, take a look at the following resources:
24 |
25 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
26 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
27 |
28 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
29 |
30 | ## Deploy on Vercel
31 |
32 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
33 |
34 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
35 |
--------------------------------------------------------------------------------
/next-client/pages/owner.js:
--------------------------------------------------------------------------------
1 | import { Container, TextField, Button } from "@mui/material";
2 | import { useState } from "react";
3 | import {useRouter} from "next/router"
4 | import ProductService from "../services/product";
5 |
6 | const OwnerPage = () => {
7 | const router = useRouter()
8 | const [product, setProduct] = useState({
9 | name: "",
10 | price: "",
11 | img: "",
12 | description: "",
13 | });
14 |
15 | const handleChange = (event) => {
16 | setProduct((prevValue) => ({
17 | ...prevValue,
18 | [event.target.name]: event.target.value,
19 | }));
20 | };
21 |
22 | const Submit = ()=>{
23 | console.log(product)
24 | ProductService.add(product)
25 | .then(res=>{
26 | alert("Product Added")
27 | })
28 | .catch(err=>{
29 | alert(err.response.data ? err.response.data.message : err.message)
30 | })
31 | }
32 |
33 | return (
34 |
35 | Create new Product
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
52 |
53 |
54 |
55 | );
56 | };
57 |
58 | export default OwnerPage;
59 |
--------------------------------------------------------------------------------
/next-client/styles/store.cart.module.css:
--------------------------------------------------------------------------------
1 | .cartBtn{
2 | position: fixed;
3 | right: 10px;
4 | bottom: 10px;
5 | height: 50px;
6 | width: 50px;
7 | background:black;
8 | border-radius: 25%;
9 | color: white;
10 | display:flex;
11 | justify-content: center;
12 | align-items: center;
13 | cursor: pointer;
14 | transition: .125s ease;
15 | }
16 |
17 | .cartBtn:hover{
18 | background:rgba(0, 0, 0, 0.85)!important;
19 | transform: scale(1.025)!important;
20 | }
21 |
22 | .cartBtn:active{
23 | transform: scale(0.95)!important;
24 | }
25 |
26 | .cartScreen{
27 | position: fixed;
28 | right: 0;
29 | bottom: 0;
30 | left: 0;
31 | top: 0;
32 | background:rgba(0, 0, 0, 0.103);
33 | }
34 |
35 | .cart{
36 | position: fixed;
37 | width: 25%;
38 | min-width: 350px;
39 | height: 80%;
40 | overflow: auto;
41 | bottom: 0;
42 | right: 0;
43 | background: white;
44 | border-radius: 15px 0 0 0;
45 | padding: 5px 20px;
46 | box-shadow: 0px 2px 1px -1px rgb(0 0 0 / 20%), 0px 1px 1px 0px rgb(0 0 0 / 14%), 0px 1px 3px 0px rgb(0 0 0 / 12%);
47 | }
48 |
49 | .items{
50 | overflow: auto;
51 | height: 75%;
52 | }
53 | .item{
54 | background:rgba(0, 0, 0, 0.053);
55 | border-radius: 10px;
56 | margin: 10px 0;
57 | padding: 10px;
58 | display: flex;
59 | justify-content: space-between;
60 | align-items: center;
61 | }
62 |
63 | .close{
64 | position: absolute!important;
65 | top: 25px!important;
66 | right: 10px!important;
67 | }
68 |
69 | .item img{
70 | width: 50px;
71 | height: 50px;
72 | border-radius: 40%;
73 | }
74 |
75 | .buyBtn{
76 | position: fixed!important;
77 | bottom: 15px!important;
78 | right: 10px!important;
79 | border-radius: 50px!important;
80 | }
81 |
82 | .price{
83 | position: absolute;
84 | bottom: 0px;
85 | }
--------------------------------------------------------------------------------
/next-client/pages/_document.js:
--------------------------------------------------------------------------------
1 | import Document, { Html, Head, Main, NextScript } from "next/document";
2 |
3 | class MyDocument extends Document {
4 | render() {
5 | return (
6 |
7 |
8 |
9 |
10 |
14 |
18 |
22 |
23 |
28 |
34 |
40 |
41 |
42 |
47 |
51 | Web3 Shopping Cart
52 |
53 |
54 |
55 |
56 |
57 |
58 | );
59 | }
60 | }
61 |
62 | export default MyDocument;
63 |
--------------------------------------------------------------------------------
/express-server/routers/order.js:
--------------------------------------------------------------------------------
1 | const router = require("express").Router();
2 | const Order = require("../models/order");
3 | const { abi } = require("../constants/abi");
4 | const ethers = require("ethers");
5 | const config = require("../utils/config")
6 | const Product = require("../models/product");
7 | // const {authExactor} = require("../utils/middleware")
8 |
9 | // router.use(authExactor)
10 |
11 | router.post("/create", async (req, res) => {
12 | const { products, email } = req.body;
13 | let price = 0;
14 | for(let product of products) {
15 | const temp = await Product.findById(product.product)
16 | price += temp.price * product.quantity
17 | }
18 | const order = new Order({ products, email,price:price.toFixed(8), isPaid: false,receiver:"" });
19 | await order.save();
20 | res.json(order);
21 | });
22 |
23 | router.post("/pay", (req, res) => {
24 | const { id,receiver } = req.body;
25 | Order.findOne({_id:id}).populate('products.product').exec(async(error, order) => {
26 | if (error) {
27 | res.json(error);
28 | } else {
29 | if (order) {
30 | if(order.isPaid){
31 | return res.json(order)
32 | }
33 | const provider = new ethers.providers.JsonRpcBatchProvider(config.CHAIN_URL);
34 | const contractAddress = config.CONTRACT_ADDRESS;
35 | const contract = new ethers.Contract(contractAddress, abi, provider);
36 | const result = await contract.getOrder(id);
37 | if (Number(result.toString()) >= Number(ethers.utils.parseEther(order.price.toString()))) {
38 | order.isPaid = true;
39 | order.receiver = receiver;
40 | order.save((err, newOrder) => {
41 | if (err) {
42 | res.status(500).json(err);
43 | } else {
44 | res.json(newOrder);
45 | }
46 | });
47 | }
48 | else{
49 | res.json({error: "Order has not been paid yet"})
50 | }
51 | } else {
52 | res.json({ error: "Order not found" });
53 | }
54 | }
55 | });
56 | });
57 |
58 | router.get("/getAll", (req, res) => {
59 | Order.find({}, (err, orders) => {
60 | if (err) {
61 | res.status(500).json(err);
62 | } else {
63 | res.json(orders);
64 | }
65 | });
66 | });
67 |
68 | router.get("/getByAddress/:address", (req, res) => {
69 | const { address } = req.params;
70 | Order.find({receiver:address}, (err, orders) => {
71 | if (err) {
72 | res.status(500).json(err);
73 | } else {
74 | res.json(orders);
75 | }
76 | });
77 | });
78 |
79 | router.get("/get/:id", (req, res) => {
80 | const { id } = req.params;
81 | Order.findOne({_id:id}).populate('products.product').exec((err, order) => {
82 | if (err) {
83 | res.status(500).json(err);
84 | } else {
85 | res.json(order);
86 | }
87 | });
88 | });
89 |
90 | module.exports = router;
91 |
--------------------------------------------------------------------------------
/next-client/components/order/payment.js:
--------------------------------------------------------------------------------
1 | import { Button } from "@mui/material";
2 | import { useSelector } from "react-redux";
3 | import { abi } from "../../constants/abi";
4 | import { LoadingButton } from "@mui/lab";
5 | import { ethers } from "ethers";
6 | import { useState } from "react";
7 |
8 | const Payment = ({ styles, pay, id, price }) => {
9 | const wallet = useSelector((state) => state.wallet.value);
10 | const [loading, setLoading] = useState(false);
11 | async function execute() {
12 | setLoading(true);
13 | if (typeof window.ethereum !== "undefined") {
14 | const contractAddress = process.env.NEXT_PUBLIC_CONTRACT;
15 | const contract = new ethers.Contract(contractAddress, abi, wallet.signer);
16 | try {
17 | const tx = await contract.pay(id, {
18 | value: ethers.utils.parseEther(price.toString()),
19 | });
20 | await tx.wait();
21 | const result = await contract.getOrder(id);
22 | if (
23 | Number(result.toString()) >=
24 | Number(ethers.utils.parseEther(price.toString()))
25 | ) {
26 | const reciever = await wallet.signer.getAddress();
27 | pay(reciever, setLoading);
28 | }
29 | } catch (error) {
30 | console.log(error);
31 | }
32 | } else {
33 | try {
34 | const contractAddress = process.env.NEXT_PUBLIC_CONTRACT;
35 | console.log(wallet.signer)
36 | const contract = new ethers.Contract(contractAddress, abi, wallet.signer);
37 | const tx = await contract.pay(id, {
38 | value: ethers.utils.parseEther(price.toString()),
39 | });
40 | await tx.wait();
41 | const result = await contract.getOrder(id);
42 | if (
43 | Number(result.toString()) >=
44 | Number(ethers.utils.parseEther(price.toString()))
45 | ) {
46 | const reciever = await wallet.signer.getAddress();
47 | pay(reciever, setLoading);
48 | }
49 | } catch (error) {
50 | console.log(error);
51 | }
52 | }
53 | // setLoading(false)
54 | }
55 |
56 | return (
57 | <>
58 |
59 | {wallet.connected
60 | ? wallet.chainId.toString() === process.env.NEXT_PUBLIC_CHAIN
61 | ? "Pay with web3!"
62 | : "Wrong Network"
63 | : "Connect Wallet"}
64 |
65 |
66 | {wallet.connected &&
67 | wallet.chainId.toString() === process.env.NEXT_PUBLIC_CHAIN && (
68 |
76 | Pay
77 |
78 | )}
79 |
80 | >
81 | );
82 | };
83 | export default Payment;
84 |
--------------------------------------------------------------------------------
/next-client/components/storeCart.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Button, IconButton } from "@mui/material";
3 | import Image from 'next/image'
4 | import { useSelector, useDispatch } from "react-redux";
5 | import { useRouter } from "next/router";
6 | import { remove } from "../reducers/cart";
7 | import { useState } from "react";
8 | import styles from "../styles/store.cart.module.css";
9 | import ShoppingCartIcon from "@mui/icons-material/ShoppingCart";
10 | import Slide from "@mui/material/Slide";
11 | import ClearIcon from "@mui/icons-material/Clear";
12 | import DeleteIcon from '@mui/icons-material/Delete';
13 | import RemoveIcon from '@mui/icons-material/Remove';
14 |
15 | export default function StoreCart() {
16 | const cart = useSelector((state) => state.cart.value);
17 | const [show, setShow] = useState(false);
18 | const dispatch = useDispatch();
19 | const router = useRouter();
20 |
21 | const Remove = (id,price)=>{
22 | dispatch(remove({product:id,price}));
23 | }
24 |
25 | return (
26 |
27 | {!show && (
28 |
setShow(true)}>
29 |
30 | {cart.products.length !== 0 && {cart.products.reduce((total,item)=>{
31 | return total+item.quantity
32 | },0)}}
33 |
34 | )}
35 | {show && (
36 |
setShow(false)}>
37 | )}
38 |
39 |
40 |
setShow(false)}
45 | >
46 |
47 |
48 |
Cart
49 |
50 | {cart.products.map((it) => (
51 |
52 | {/* eslint-disable-next-line @next/next/no-img-element */}
53 |

54 |
{it.data.name}
55 |
{it.data.price} BNB
56 |
{it.quantity}
57 | {it.quantity === 1 ?
Remove(it.product,it.data.price)}
60 | >
61 |
62 | :
Remove(it.product,it.data.price)}
65 | >
66 |
67 | }
68 |
69 | ))}
70 |
71 |
72 |
Price: {cart.price.toFixed(5)} BNB
73 |
81 |
82 |
83 |
84 |
85 | );
86 | }
87 |
--------------------------------------------------------------------------------
/next-client/pages/cart.js:
--------------------------------------------------------------------------------
1 | import Image from "next/image";
2 | import { Grid, Container, TextField } from "@mui/material";
3 | import { useSelector, useDispatch } from "react-redux";
4 | import { LoadingButton } from "@mui/lab";
5 | import { useState, useEffect } from "react";
6 | import OrderService from "../services/order";
7 | import { clear } from "../reducers/cart";
8 | import { useRouter } from "next/router";
9 | import styles from "../styles/cart.module.css";
10 | import Hero from "../components/hero";
11 |
12 | const CartPage = () => {
13 | const cart = useSelector((state) => state.cart.value);
14 | const router = useRouter();
15 | const [email, setEmail] = useState("");
16 | const [loading, setLoading] = useState(false);
17 | const dispatch = useDispatch();
18 |
19 | useEffect(() => {
20 | if (cart.products.length === 0) router.push("/");
21 | // eslint-disable-next-line react-hooks/exhaustive-deps
22 | }, []);
23 |
24 | const clearCart = () => {
25 | dispatch(clear());
26 | };
27 |
28 | const buy = async (e) => {
29 | e.preventDefault();
30 | setLoading(true);
31 | if (email) {
32 | await OrderService.create({ products: cart.products, email })
33 | .then((res) => {
34 | router.push("/order?id=" + res.data._id);
35 | })
36 | .catch((err) => {
37 | console.log(err);
38 | alert("Error");
39 | });
40 | }
41 | setLoading(false);
42 | clearCart();
43 | };
44 |
45 | return (
46 | <>
47 |
48 |
49 |
50 |
51 |
52 |
Information
53 |
77 |
78 |
79 |
80 |
81 |
Products
82 |
83 | {cart.products.map((it) => (
84 |
85 | {/* eslint-disable-next-line @next/next/no-img-element */}
86 |

92 |
{it.data.name}
93 |
{it.data.price} BNB
94 |
{it.quantity}
95 |
96 | ))}
97 |
98 |
99 |
100 | Price: {cart.price.toFixed(5)} BNB
101 |
102 |
103 |
104 |
105 |
106 |
107 | >
108 | );
109 | };
110 |
111 | export default CartPage;
112 |
--------------------------------------------------------------------------------
/next-client/pages/order.js:
--------------------------------------------------------------------------------
1 | import { useRouter } from "next/router";
2 | import { useEffect, useState } from "react";
3 | import { Button, Container, Grid } from "@mui/material";
4 | import Image from "next/image";
5 | import Hero from "../components/hero"
6 | import { ethers } from "ethers";
7 | import { abi } from "../constants/abi";
8 | import styles from "../styles/order.module.css";
9 | import OrderService from "../services/order";
10 |
11 | import Payment from "../components/order/payment";
12 |
13 | const Order = ({ query }) => {
14 | const router = useRouter();
15 |
16 | const [orderData, setOrderData] = useState({
17 | _id: "",
18 | products: [],
19 | email: "",
20 | isPaid: false,
21 | receiver: "",
22 | });
23 |
24 | async function getOrder(order) {
25 | if (typeof window.ethereum !== "undefined") {
26 | const provider = new ethers.providers.JsonRpcBatchProvider(
27 | process.env.NEXT_PUBLIC_RPC_URL
28 | );
29 | const contractAddress = process.env.NEXT_PUBLIC_CONTRACT;
30 | const contract = new ethers.Contract(contractAddress, abi, provider);
31 | try {
32 | const result = await contract.getOrder(query.id);
33 | if (Number(result.toString()) >= order.price) {
34 | pay("")
35 | setOrderData({ ...orderData, isPaid: true });
36 | }
37 | } catch (error) {
38 | console.log(error);
39 | }
40 | } else {
41 | console.log("Please install MetaMask");
42 | }
43 | }
44 |
45 | const pay = (receiver,setLoading) => {
46 | OrderService.pay(query.id, receiver)
47 | .then((res) => {
48 | if (res.data) {
49 | setOrderData(res.data);
50 | if(setLoading){
51 | setLoading(false)
52 | }
53 | } else {
54 | alert("Error");
55 | setLoading(false)
56 | }
57 | })
58 | .catch((err) => {
59 | alert("Error");
60 | setLoading(false)
61 | });
62 | };
63 |
64 | useEffect(() => {
65 | if (!query.id) {
66 | router.push("/");
67 | } else {
68 | OrderService.get(query.id)
69 | .then((res) => {
70 | if (res.data) {
71 | setOrderData(res.data);
72 | if (!res.data.isPaid) getOrder(res.data);
73 | } else {
74 | router.push("/");
75 | }
76 | }, [])
77 | .catch((err) => {
78 | router.push("/");
79 | });
80 | }
81 | // eslint-disable-next-line react-hooks/exhaustive-deps
82 | }, []);
83 | return (
84 | <>
85 |
86 |
87 |
88 |
89 |
90 | {!orderData.isPaid ? (
) : (
91 |
92 |
Payment received.
93 |
94 | )}
95 |
96 |
97 |
98 |
99 |
100 |
Products
101 |
102 | {orderData.products.map((it) => (
103 |
104 | {/* eslint-disable-next-line @next/next/no-img-element */}
105 |

111 |
{it.product.name}
112 |
{it.product.price} BNB
113 |
{it.quantity}
114 |
115 | ))}
116 |
117 |
118 |
119 | Price: {orderData.price && Number(orderData.price).toFixed(5)} BNB
120 |
121 |
122 |
123 |
124 |
125 |
126 | >
127 | );
128 | };
129 |
130 | Order.getInitialProps = ({ query }) => {
131 | return { query };
132 | };
133 |
134 | export default Order;
135 |
--------------------------------------------------------------------------------
/next-client/components/appbar.js:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import AppBar from '@mui/material/AppBar';
3 | import Box from '@mui/material/Box';
4 | import Toolbar from '@mui/material/Toolbar';
5 | import IconButton from '@mui/material/IconButton';
6 | import Typography from '@mui/material/Typography';
7 | import Menu from '@mui/material/Menu';
8 | import MenuIcon from '@mui/icons-material/Menu';
9 | import Container from '@mui/material/Container';
10 | import Avatar from '@mui/material/Avatar';
11 | import Button from '@mui/material/Button';
12 | import Tooltip from '@mui/material/Tooltip';
13 | import MenuItem from '@mui/material/MenuItem';
14 | import AdbIcon from '@mui/icons-material/Adb';
15 | import {useRouter} from "next/router"
16 |
17 | const pages = ['Products'];
18 |
19 | const ResponsiveAppBar = () => {
20 | const [anchorElNav, setAnchorElNav] = React.useState(null);
21 | const [anchorElUser, setAnchorElUser] = React.useState(null);
22 | const router = useRouter()
23 |
24 | const handleOpenNavMenu = (event) => {
25 | setAnchorElNav(event.currentTarget);
26 | };
27 | const handleOpenUserMenu = (event) => {
28 | setAnchorElUser(event.currentTarget);
29 | };
30 |
31 | const handleCloseNavMenu = () => {
32 | setAnchorElNav(null);
33 | };
34 |
35 | const handleCloseUserMenu = () => {
36 | setAnchorElUser(null);
37 | };
38 |
39 | return (
40 |
41 |
42 |
43 |
44 |
59 | Web3-Payment
60 |
61 |
62 |
63 |
71 |
72 |
73 |
97 |
98 |
99 |
115 | Web3-Payment
116 |
117 |
118 | {pages.map((page) => (
119 |
126 | ))}
127 |
128 |
129 |
130 |
131 | );
132 | };
133 | export default ResponsiveAppBar;
134 |
--------------------------------------------------------------------------------
/next-client/components/header.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable @next/next/no-img-element */
2 | import Web3Modal from "web3modal";
3 | import { useEffect,useState } from "react";
4 | import { ethers } from "ethers";
5 | import { useSelector, useDispatch } from "react-redux";
6 | import WalletConnectProvider from "@walletconnect/web3-provider";
7 | import NextLink from "next/link";
8 | import { connect, disconnect } from "../reducers/wallet";
9 | import styles from "../styles/header.module.css";
10 |
11 | let web3Modal;
12 |
13 | const providerOptions = {
14 | walletconnect: {
15 | package: WalletConnectProvider, // required
16 | options: {
17 | rpc: { [process.env.NEXT_PUBLIC_CHAIN]: process.env.NEXT_PUBLIC_RPC_URL }, // required
18 | network:"binance"
19 | },
20 | },
21 | };
22 |
23 | const Header = () => {
24 | const dispatch = useDispatch();
25 | const wallet = useSelector((state) => state.wallet.value);
26 |
27 | useEffect(() => {
28 | web3Modal = new Web3Modal({
29 | cacheProvider: true,
30 | providerOptions, // required
31 | });
32 | }, []);
33 |
34 | useEffect(() => {
35 | if (window.ethereum) {
36 | const provider = new ethers.providers.Web3Provider(
37 | window.ethereum,
38 | "any"
39 | );
40 | provider.on("network", async (newNetwork, oldNetwork) => {
41 | const provider = new ethers.providers.Web3Provider(window.ethereum);
42 | dispatch(
43 | connect({ chainId: newNetwork.chainId, signer: provider.getSigner() })
44 | );
45 | });
46 | }
47 | // eslint-disable-next-line react-hooks/exhaustive-deps
48 | }, []);
49 |
50 | async function Connect() {
51 | try {
52 | if (typeof window.ethereum !== "undefined") {
53 | const web3ModalProvider = await web3Modal.connect();
54 | const provider = new ethers.providers.Web3Provider(web3ModalProvider);
55 | const { chainId } = await provider.getNetwork();
56 | dispatch(connect({ chainId, signer: provider.getSigner() }));
57 | } else {
58 | const web3ModalProvider = await web3Modal.connect();
59 | const provider = new ethers.providers.Web3Provider(web3ModalProvider);
60 | const { chainId } = await provider.getNetwork();
61 | dispatch(connect({ chainId, signer: provider.getSigner() }));
62 | }
63 | } catch (error) {
64 | console.log(error);
65 | }
66 | }
67 |
68 | async function Disconnect() {
69 | dispatch(disconnect());
70 | await web3Modal.clearCachedProvider();
71 | localStorage.removeItem("walletconnect")
72 | }
73 |
74 | const setupNetwork = async () => {
75 | const provider = window.ethereum
76 | if (provider) {
77 | const chainId = parseInt(process.env.NEXT_PUBLIC_CHAIN, 10)
78 | try {
79 | await provider.request({
80 | method: 'wallet_addEthereumChain',
81 | params: [
82 | {
83 | chainId: `0x${chainId.toString(16)}`,
84 | chainName: 'Binance Smart Chain Mainnet',
85 | nativeCurrency: {
86 | name: 'BNB',
87 | symbol: 'bnb',
88 | decimals: 18,
89 | },
90 | rpcUrls: ["https://bsc-dataseed1.ninicoin.io","https://bsc-dataseed1.defibit.io","https://bsc-dataseed.binance.org"],
91 | blockExplorerUrls: ['https://bscscan.com'],
92 | },
93 | ],
94 | })
95 | return true
96 | } catch (error) {
97 | console.error('Failed to setup the network in Metamask:', error)
98 | return false
99 | }
100 | } else {
101 | console.error("Can't setup the BSC network on metamask because window.ethereum is undefined")
102 | return false
103 | }
104 | }
105 |
106 |
107 | function wrongNetwork() {
108 | if(!window.ethereum){
109 | Disconnect();
110 | return
111 | }
112 | setupNetwork();
113 | }
114 | return (
115 |
116 |
117 |
118 |
119 |

120 |
Web3 Shopping Cart
121 |
122 |
123 |
124 |
125 | {!wallet.connected && (
126 |
129 | )}
130 | {wallet.connected && wallet.chainId.toString() === process.env.NEXT_PUBLIC_CHAIN && (
131 |
138 | )}
139 | {wallet.connected && wallet.chainId.toString() !== process.env.NEXT_PUBLIC_CHAIN && (
140 |
147 | )}
148 |
149 |
150 | );
151 | };
152 |
153 | export default Header;
154 |
--------------------------------------------------------------------------------
/express-server/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@ethersproject/abi@5.6.4", "@ethersproject/abi@^5.6.3":
6 | version "5.6.4"
7 | resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362"
8 | integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg==
9 | dependencies:
10 | "@ethersproject/address" "^5.6.1"
11 | "@ethersproject/bignumber" "^5.6.2"
12 | "@ethersproject/bytes" "^5.6.1"
13 | "@ethersproject/constants" "^5.6.1"
14 | "@ethersproject/hash" "^5.6.1"
15 | "@ethersproject/keccak256" "^5.6.1"
16 | "@ethersproject/logger" "^5.6.0"
17 | "@ethersproject/properties" "^5.6.0"
18 | "@ethersproject/strings" "^5.6.1"
19 |
20 | "@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1":
21 | version "5.6.1"
22 | resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59"
23 | integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ==
24 | dependencies:
25 | "@ethersproject/bignumber" "^5.6.2"
26 | "@ethersproject/bytes" "^5.6.1"
27 | "@ethersproject/logger" "^5.6.0"
28 | "@ethersproject/networks" "^5.6.3"
29 | "@ethersproject/properties" "^5.6.0"
30 | "@ethersproject/transactions" "^5.6.2"
31 | "@ethersproject/web" "^5.6.1"
32 |
33 | "@ethersproject/abstract-signer@5.6.2", "@ethersproject/abstract-signer@^5.6.2":
34 | version "5.6.2"
35 | resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33"
36 | integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ==
37 | dependencies:
38 | "@ethersproject/abstract-provider" "^5.6.1"
39 | "@ethersproject/bignumber" "^5.6.2"
40 | "@ethersproject/bytes" "^5.6.1"
41 | "@ethersproject/logger" "^5.6.0"
42 | "@ethersproject/properties" "^5.6.0"
43 |
44 | "@ethersproject/address@5.6.1", "@ethersproject/address@^5.6.1":
45 | version "5.6.1"
46 | resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d"
47 | integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==
48 | dependencies:
49 | "@ethersproject/bignumber" "^5.6.2"
50 | "@ethersproject/bytes" "^5.6.1"
51 | "@ethersproject/keccak256" "^5.6.1"
52 | "@ethersproject/logger" "^5.6.0"
53 | "@ethersproject/rlp" "^5.6.1"
54 |
55 | "@ethersproject/base64@5.6.1", "@ethersproject/base64@^5.6.1":
56 | version "5.6.1"
57 | resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb"
58 | integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw==
59 | dependencies:
60 | "@ethersproject/bytes" "^5.6.1"
61 |
62 | "@ethersproject/basex@5.6.1", "@ethersproject/basex@^5.6.1":
63 | version "5.6.1"
64 | resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305"
65 | integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA==
66 | dependencies:
67 | "@ethersproject/bytes" "^5.6.1"
68 | "@ethersproject/properties" "^5.6.0"
69 |
70 | "@ethersproject/bignumber@5.6.2", "@ethersproject/bignumber@^5.6.2":
71 | version "5.6.2"
72 | resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66"
73 | integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw==
74 | dependencies:
75 | "@ethersproject/bytes" "^5.6.1"
76 | "@ethersproject/logger" "^5.6.0"
77 | bn.js "^5.2.1"
78 |
79 | "@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.6.1":
80 | version "5.6.1"
81 | resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7"
82 | integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==
83 | dependencies:
84 | "@ethersproject/logger" "^5.6.0"
85 |
86 | "@ethersproject/constants@5.6.1", "@ethersproject/constants@^5.6.1":
87 | version "5.6.1"
88 | resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370"
89 | integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg==
90 | dependencies:
91 | "@ethersproject/bignumber" "^5.6.2"
92 |
93 | "@ethersproject/contracts@5.6.2":
94 | version "5.6.2"
95 | resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc"
96 | integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g==
97 | dependencies:
98 | "@ethersproject/abi" "^5.6.3"
99 | "@ethersproject/abstract-provider" "^5.6.1"
100 | "@ethersproject/abstract-signer" "^5.6.2"
101 | "@ethersproject/address" "^5.6.1"
102 | "@ethersproject/bignumber" "^5.6.2"
103 | "@ethersproject/bytes" "^5.6.1"
104 | "@ethersproject/constants" "^5.6.1"
105 | "@ethersproject/logger" "^5.6.0"
106 | "@ethersproject/properties" "^5.6.0"
107 | "@ethersproject/transactions" "^5.6.2"
108 |
109 | "@ethersproject/hash@5.6.1", "@ethersproject/hash@^5.6.1":
110 | version "5.6.1"
111 | resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4"
112 | integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA==
113 | dependencies:
114 | "@ethersproject/abstract-signer" "^5.6.2"
115 | "@ethersproject/address" "^5.6.1"
116 | "@ethersproject/bignumber" "^5.6.2"
117 | "@ethersproject/bytes" "^5.6.1"
118 | "@ethersproject/keccak256" "^5.6.1"
119 | "@ethersproject/logger" "^5.6.0"
120 | "@ethersproject/properties" "^5.6.0"
121 | "@ethersproject/strings" "^5.6.1"
122 |
123 | "@ethersproject/hdnode@5.6.2", "@ethersproject/hdnode@^5.6.2":
124 | version "5.6.2"
125 | resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2"
126 | integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q==
127 | dependencies:
128 | "@ethersproject/abstract-signer" "^5.6.2"
129 | "@ethersproject/basex" "^5.6.1"
130 | "@ethersproject/bignumber" "^5.6.2"
131 | "@ethersproject/bytes" "^5.6.1"
132 | "@ethersproject/logger" "^5.6.0"
133 | "@ethersproject/pbkdf2" "^5.6.1"
134 | "@ethersproject/properties" "^5.6.0"
135 | "@ethersproject/sha2" "^5.6.1"
136 | "@ethersproject/signing-key" "^5.6.2"
137 | "@ethersproject/strings" "^5.6.1"
138 | "@ethersproject/transactions" "^5.6.2"
139 | "@ethersproject/wordlists" "^5.6.1"
140 |
141 | "@ethersproject/json-wallets@5.6.1", "@ethersproject/json-wallets@^5.6.1":
142 | version "5.6.1"
143 | resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91"
144 | integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ==
145 | dependencies:
146 | "@ethersproject/abstract-signer" "^5.6.2"
147 | "@ethersproject/address" "^5.6.1"
148 | "@ethersproject/bytes" "^5.6.1"
149 | "@ethersproject/hdnode" "^5.6.2"
150 | "@ethersproject/keccak256" "^5.6.1"
151 | "@ethersproject/logger" "^5.6.0"
152 | "@ethersproject/pbkdf2" "^5.6.1"
153 | "@ethersproject/properties" "^5.6.0"
154 | "@ethersproject/random" "^5.6.1"
155 | "@ethersproject/strings" "^5.6.1"
156 | "@ethersproject/transactions" "^5.6.2"
157 | aes-js "3.0.0"
158 | scrypt-js "3.0.1"
159 |
160 | "@ethersproject/keccak256@5.6.1", "@ethersproject/keccak256@^5.6.1":
161 | version "5.6.1"
162 | resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc"
163 | integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA==
164 | dependencies:
165 | "@ethersproject/bytes" "^5.6.1"
166 | js-sha3 "0.8.0"
167 |
168 | "@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0":
169 | version "5.6.0"
170 | resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a"
171 | integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==
172 |
173 | "@ethersproject/networks@5.6.4", "@ethersproject/networks@^5.6.3":
174 | version "5.6.4"
175 | resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07"
176 | integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ==
177 | dependencies:
178 | "@ethersproject/logger" "^5.6.0"
179 |
180 | "@ethersproject/pbkdf2@5.6.1", "@ethersproject/pbkdf2@^5.6.1":
181 | version "5.6.1"
182 | resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1"
183 | integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ==
184 | dependencies:
185 | "@ethersproject/bytes" "^5.6.1"
186 | "@ethersproject/sha2" "^5.6.1"
187 |
188 | "@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0":
189 | version "5.6.0"
190 | resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04"
191 | integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==
192 | dependencies:
193 | "@ethersproject/logger" "^5.6.0"
194 |
195 | "@ethersproject/providers@5.6.8":
196 | version "5.6.8"
197 | resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d"
198 | integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w==
199 | dependencies:
200 | "@ethersproject/abstract-provider" "^5.6.1"
201 | "@ethersproject/abstract-signer" "^5.6.2"
202 | "@ethersproject/address" "^5.6.1"
203 | "@ethersproject/base64" "^5.6.1"
204 | "@ethersproject/basex" "^5.6.1"
205 | "@ethersproject/bignumber" "^5.6.2"
206 | "@ethersproject/bytes" "^5.6.1"
207 | "@ethersproject/constants" "^5.6.1"
208 | "@ethersproject/hash" "^5.6.1"
209 | "@ethersproject/logger" "^5.6.0"
210 | "@ethersproject/networks" "^5.6.3"
211 | "@ethersproject/properties" "^5.6.0"
212 | "@ethersproject/random" "^5.6.1"
213 | "@ethersproject/rlp" "^5.6.1"
214 | "@ethersproject/sha2" "^5.6.1"
215 | "@ethersproject/strings" "^5.6.1"
216 | "@ethersproject/transactions" "^5.6.2"
217 | "@ethersproject/web" "^5.6.1"
218 | bech32 "1.1.4"
219 | ws "7.4.6"
220 |
221 | "@ethersproject/random@5.6.1", "@ethersproject/random@^5.6.1":
222 | version "5.6.1"
223 | resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255"
224 | integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA==
225 | dependencies:
226 | "@ethersproject/bytes" "^5.6.1"
227 | "@ethersproject/logger" "^5.6.0"
228 |
229 | "@ethersproject/rlp@5.6.1", "@ethersproject/rlp@^5.6.1":
230 | version "5.6.1"
231 | resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8"
232 | integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ==
233 | dependencies:
234 | "@ethersproject/bytes" "^5.6.1"
235 | "@ethersproject/logger" "^5.6.0"
236 |
237 | "@ethersproject/sha2@5.6.1", "@ethersproject/sha2@^5.6.1":
238 | version "5.6.1"
239 | resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656"
240 | integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g==
241 | dependencies:
242 | "@ethersproject/bytes" "^5.6.1"
243 | "@ethersproject/logger" "^5.6.0"
244 | hash.js "1.1.7"
245 |
246 | "@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2":
247 | version "5.6.2"
248 | resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3"
249 | integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ==
250 | dependencies:
251 | "@ethersproject/bytes" "^5.6.1"
252 | "@ethersproject/logger" "^5.6.0"
253 | "@ethersproject/properties" "^5.6.0"
254 | bn.js "^5.2.1"
255 | elliptic "6.5.4"
256 | hash.js "1.1.7"
257 |
258 | "@ethersproject/solidity@5.6.1":
259 | version "5.6.1"
260 | resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2"
261 | integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g==
262 | dependencies:
263 | "@ethersproject/bignumber" "^5.6.2"
264 | "@ethersproject/bytes" "^5.6.1"
265 | "@ethersproject/keccak256" "^5.6.1"
266 | "@ethersproject/logger" "^5.6.0"
267 | "@ethersproject/sha2" "^5.6.1"
268 | "@ethersproject/strings" "^5.6.1"
269 |
270 | "@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.6.1":
271 | version "5.6.1"
272 | resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952"
273 | integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw==
274 | dependencies:
275 | "@ethersproject/bytes" "^5.6.1"
276 | "@ethersproject/constants" "^5.6.1"
277 | "@ethersproject/logger" "^5.6.0"
278 |
279 | "@ethersproject/transactions@5.6.2", "@ethersproject/transactions@^5.6.2":
280 | version "5.6.2"
281 | resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b"
282 | integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q==
283 | dependencies:
284 | "@ethersproject/address" "^5.6.1"
285 | "@ethersproject/bignumber" "^5.6.2"
286 | "@ethersproject/bytes" "^5.6.1"
287 | "@ethersproject/constants" "^5.6.1"
288 | "@ethersproject/keccak256" "^5.6.1"
289 | "@ethersproject/logger" "^5.6.0"
290 | "@ethersproject/properties" "^5.6.0"
291 | "@ethersproject/rlp" "^5.6.1"
292 | "@ethersproject/signing-key" "^5.6.2"
293 |
294 | "@ethersproject/units@5.6.1":
295 | version "5.6.1"
296 | resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f"
297 | integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw==
298 | dependencies:
299 | "@ethersproject/bignumber" "^5.6.2"
300 | "@ethersproject/constants" "^5.6.1"
301 | "@ethersproject/logger" "^5.6.0"
302 |
303 | "@ethersproject/wallet@5.6.2":
304 | version "5.6.2"
305 | resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c"
306 | integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg==
307 | dependencies:
308 | "@ethersproject/abstract-provider" "^5.6.1"
309 | "@ethersproject/abstract-signer" "^5.6.2"
310 | "@ethersproject/address" "^5.6.1"
311 | "@ethersproject/bignumber" "^5.6.2"
312 | "@ethersproject/bytes" "^5.6.1"
313 | "@ethersproject/hash" "^5.6.1"
314 | "@ethersproject/hdnode" "^5.6.2"
315 | "@ethersproject/json-wallets" "^5.6.1"
316 | "@ethersproject/keccak256" "^5.6.1"
317 | "@ethersproject/logger" "^5.6.0"
318 | "@ethersproject/properties" "^5.6.0"
319 | "@ethersproject/random" "^5.6.1"
320 | "@ethersproject/signing-key" "^5.6.2"
321 | "@ethersproject/transactions" "^5.6.2"
322 | "@ethersproject/wordlists" "^5.6.1"
323 |
324 | "@ethersproject/web@5.6.1", "@ethersproject/web@^5.6.1":
325 | version "5.6.1"
326 | resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d"
327 | integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA==
328 | dependencies:
329 | "@ethersproject/base64" "^5.6.1"
330 | "@ethersproject/bytes" "^5.6.1"
331 | "@ethersproject/logger" "^5.6.0"
332 | "@ethersproject/properties" "^5.6.0"
333 | "@ethersproject/strings" "^5.6.1"
334 |
335 | "@ethersproject/wordlists@5.6.1", "@ethersproject/wordlists@^5.6.1":
336 | version "5.6.1"
337 | resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1"
338 | integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw==
339 | dependencies:
340 | "@ethersproject/bytes" "^5.6.1"
341 | "@ethersproject/hash" "^5.6.1"
342 | "@ethersproject/logger" "^5.6.0"
343 | "@ethersproject/properties" "^5.6.0"
344 | "@ethersproject/strings" "^5.6.1"
345 |
346 | "@types/node@*":
347 | version "18.0.0"
348 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
349 | integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
350 |
351 | "@types/webidl-conversions@*":
352 | version "6.1.1"
353 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e"
354 | integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==
355 |
356 | "@types/whatwg-url@^8.2.1":
357 | version "8.2.1"
358 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.1.tgz#f1aac222dab7c59e011663a0cb0a3117b2ef05d4"
359 | integrity sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==
360 | dependencies:
361 | "@types/node" "*"
362 | "@types/webidl-conversions" "*"
363 |
364 | accepts@~1.3.8:
365 | version "1.3.8"
366 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
367 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
368 | dependencies:
369 | mime-types "~2.1.34"
370 | negotiator "0.6.3"
371 |
372 | aes-js@3.0.0:
373 | version "3.0.0"
374 | resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
375 | integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==
376 |
377 | array-flatten@1.1.1:
378 | version "1.1.1"
379 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
380 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
381 |
382 | base64-js@^1.3.1:
383 | version "1.5.1"
384 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
385 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
386 |
387 | bech32@1.1.4:
388 | version "1.1.4"
389 | resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
390 | integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
391 |
392 | bn.js@^4.11.9:
393 | version "4.12.0"
394 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
395 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
396 |
397 | bn.js@^5.2.1:
398 | version "5.2.1"
399 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
400 | integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
401 |
402 | body-parser@1.20.0:
403 | version "1.20.0"
404 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"
405 | integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
406 | dependencies:
407 | bytes "3.1.2"
408 | content-type "~1.0.4"
409 | debug "2.6.9"
410 | depd "2.0.0"
411 | destroy "1.2.0"
412 | http-errors "2.0.0"
413 | iconv-lite "0.4.24"
414 | on-finished "2.4.1"
415 | qs "6.10.3"
416 | raw-body "2.5.1"
417 | type-is "~1.6.18"
418 | unpipe "1.0.0"
419 |
420 | brorand@^1.1.0:
421 | version "1.1.0"
422 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
423 | integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
424 |
425 | bson@^4.6.2, bson@^4.6.3:
426 | version "4.6.4"
427 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.4.tgz#e66d4a334f1ab230dfcfb9ec4ea9091476dd372e"
428 | integrity sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==
429 | dependencies:
430 | buffer "^5.6.0"
431 |
432 | buffer-equal-constant-time@1.0.1:
433 | version "1.0.1"
434 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
435 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
436 |
437 | buffer@^5.6.0:
438 | version "5.7.1"
439 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
440 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
441 | dependencies:
442 | base64-js "^1.3.1"
443 | ieee754 "^1.1.13"
444 |
445 | bytes@3.1.2:
446 | version "3.1.2"
447 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
448 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
449 |
450 | call-bind@^1.0.0:
451 | version "1.0.2"
452 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
453 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
454 | dependencies:
455 | function-bind "^1.1.1"
456 | get-intrinsic "^1.0.2"
457 |
458 | content-disposition@0.5.4:
459 | version "0.5.4"
460 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
461 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
462 | dependencies:
463 | safe-buffer "5.2.1"
464 |
465 | content-type@~1.0.4:
466 | version "1.0.4"
467 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
468 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
469 |
470 | cookie-signature@1.0.6:
471 | version "1.0.6"
472 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
473 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
474 |
475 | cookie@0.5.0:
476 | version "0.5.0"
477 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
478 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
479 |
480 | cors@^2.8.5:
481 | version "2.8.5"
482 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
483 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
484 | dependencies:
485 | object-assign "^4"
486 | vary "^1"
487 |
488 | debug@2.6.9:
489 | version "2.6.9"
490 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
491 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
492 | dependencies:
493 | ms "2.0.0"
494 |
495 | debug@4.x:
496 | version "4.3.4"
497 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
498 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
499 | dependencies:
500 | ms "2.1.2"
501 |
502 | denque@^2.0.1:
503 | version "2.0.1"
504 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a"
505 | integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==
506 |
507 | depd@2.0.0:
508 | version "2.0.0"
509 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
510 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
511 |
512 | destroy@1.2.0:
513 | version "1.2.0"
514 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
515 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
516 |
517 | dotenv@^16.0.1:
518 | version "16.0.1"
519 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d"
520 | integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==
521 |
522 | ecdsa-sig-formatter@1.0.11:
523 | version "1.0.11"
524 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
525 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
526 | dependencies:
527 | safe-buffer "^5.0.1"
528 |
529 | ee-first@1.1.1:
530 | version "1.1.1"
531 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
532 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
533 |
534 | elliptic@6.5.4:
535 | version "6.5.4"
536 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
537 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
538 | dependencies:
539 | bn.js "^4.11.9"
540 | brorand "^1.1.0"
541 | hash.js "^1.0.0"
542 | hmac-drbg "^1.0.1"
543 | inherits "^2.0.4"
544 | minimalistic-assert "^1.0.1"
545 | minimalistic-crypto-utils "^1.0.1"
546 |
547 | encodeurl@~1.0.2:
548 | version "1.0.2"
549 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
550 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
551 |
552 | escape-html@~1.0.3:
553 | version "1.0.3"
554 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
555 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
556 |
557 | etag@~1.8.1:
558 | version "1.8.1"
559 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
560 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
561 |
562 | ethers@^5.6.9:
563 | version "5.6.9"
564 | resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.9.tgz#4e12f8dfcb67b88ae7a78a9519b384c23c576a4d"
565 | integrity sha512-lMGC2zv9HC5EC+8r429WaWu3uWJUCgUCt8xxKCFqkrFuBDZXDYIdzDUECxzjf2BMF8IVBByY1EBoGSL3RTm8RA==
566 | dependencies:
567 | "@ethersproject/abi" "5.6.4"
568 | "@ethersproject/abstract-provider" "5.6.1"
569 | "@ethersproject/abstract-signer" "5.6.2"
570 | "@ethersproject/address" "5.6.1"
571 | "@ethersproject/base64" "5.6.1"
572 | "@ethersproject/basex" "5.6.1"
573 | "@ethersproject/bignumber" "5.6.2"
574 | "@ethersproject/bytes" "5.6.1"
575 | "@ethersproject/constants" "5.6.1"
576 | "@ethersproject/contracts" "5.6.2"
577 | "@ethersproject/hash" "5.6.1"
578 | "@ethersproject/hdnode" "5.6.2"
579 | "@ethersproject/json-wallets" "5.6.1"
580 | "@ethersproject/keccak256" "5.6.1"
581 | "@ethersproject/logger" "5.6.0"
582 | "@ethersproject/networks" "5.6.4"
583 | "@ethersproject/pbkdf2" "5.6.1"
584 | "@ethersproject/properties" "5.6.0"
585 | "@ethersproject/providers" "5.6.8"
586 | "@ethersproject/random" "5.6.1"
587 | "@ethersproject/rlp" "5.6.1"
588 | "@ethersproject/sha2" "5.6.1"
589 | "@ethersproject/signing-key" "5.6.2"
590 | "@ethersproject/solidity" "5.6.1"
591 | "@ethersproject/strings" "5.6.1"
592 | "@ethersproject/transactions" "5.6.2"
593 | "@ethersproject/units" "5.6.1"
594 | "@ethersproject/wallet" "5.6.2"
595 | "@ethersproject/web" "5.6.1"
596 | "@ethersproject/wordlists" "5.6.1"
597 |
598 | express@^4.18.1:
599 | version "4.18.1"
600 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
601 | integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==
602 | dependencies:
603 | accepts "~1.3.8"
604 | array-flatten "1.1.1"
605 | body-parser "1.20.0"
606 | content-disposition "0.5.4"
607 | content-type "~1.0.4"
608 | cookie "0.5.0"
609 | cookie-signature "1.0.6"
610 | debug "2.6.9"
611 | depd "2.0.0"
612 | encodeurl "~1.0.2"
613 | escape-html "~1.0.3"
614 | etag "~1.8.1"
615 | finalhandler "1.2.0"
616 | fresh "0.5.2"
617 | http-errors "2.0.0"
618 | merge-descriptors "1.0.1"
619 | methods "~1.1.2"
620 | on-finished "2.4.1"
621 | parseurl "~1.3.3"
622 | path-to-regexp "0.1.7"
623 | proxy-addr "~2.0.7"
624 | qs "6.10.3"
625 | range-parser "~1.2.1"
626 | safe-buffer "5.2.1"
627 | send "0.18.0"
628 | serve-static "1.15.0"
629 | setprototypeof "1.2.0"
630 | statuses "2.0.1"
631 | type-is "~1.6.18"
632 | utils-merge "1.0.1"
633 | vary "~1.1.2"
634 |
635 | finalhandler@1.2.0:
636 | version "1.2.0"
637 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
638 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
639 | dependencies:
640 | debug "2.6.9"
641 | encodeurl "~1.0.2"
642 | escape-html "~1.0.3"
643 | on-finished "2.4.1"
644 | parseurl "~1.3.3"
645 | statuses "2.0.1"
646 | unpipe "~1.0.0"
647 |
648 | forwarded@0.2.0:
649 | version "0.2.0"
650 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
651 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
652 |
653 | fresh@0.5.2:
654 | version "0.5.2"
655 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
656 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
657 |
658 | function-bind@^1.1.1:
659 | version "1.1.1"
660 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
661 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
662 |
663 | get-intrinsic@^1.0.2:
664 | version "1.1.2"
665 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
666 | integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
667 | dependencies:
668 | function-bind "^1.1.1"
669 | has "^1.0.3"
670 | has-symbols "^1.0.3"
671 |
672 | has-symbols@^1.0.3:
673 | version "1.0.3"
674 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
675 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
676 |
677 | has@^1.0.3:
678 | version "1.0.3"
679 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
680 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
681 | dependencies:
682 | function-bind "^1.1.1"
683 |
684 | hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3:
685 | version "1.1.7"
686 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
687 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
688 | dependencies:
689 | inherits "^2.0.3"
690 | minimalistic-assert "^1.0.1"
691 |
692 | helmet@^5.1.0:
693 | version "5.1.0"
694 | resolved "https://registry.yarnpkg.com/helmet/-/helmet-5.1.0.tgz#e98a5d4bf89ab8119c856018a3bcc82addadcd47"
695 | integrity sha512-klsunXs8rgNSZoaUrNeuCiWUxyc+wzucnEnFejUg3/A+CaF589k9qepLZZ1Jehnzig7YbD4hEuscGXuBY3fq+g==
696 |
697 | hmac-drbg@^1.0.1:
698 | version "1.0.1"
699 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
700 | integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
701 | dependencies:
702 | hash.js "^1.0.3"
703 | minimalistic-assert "^1.0.0"
704 | minimalistic-crypto-utils "^1.0.1"
705 |
706 | http-errors@2.0.0:
707 | version "2.0.0"
708 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
709 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
710 | dependencies:
711 | depd "2.0.0"
712 | inherits "2.0.4"
713 | setprototypeof "1.2.0"
714 | statuses "2.0.1"
715 | toidentifier "1.0.1"
716 |
717 | iconv-lite@0.4.24:
718 | version "0.4.24"
719 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
720 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
721 | dependencies:
722 | safer-buffer ">= 2.1.2 < 3"
723 |
724 | ieee754@^1.1.13:
725 | version "1.2.1"
726 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
727 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
728 |
729 | inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4:
730 | version "2.0.4"
731 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
732 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
733 |
734 | ip@^1.1.5:
735 | version "1.1.8"
736 | resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48"
737 | integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==
738 |
739 | ipaddr.js@1.9.1:
740 | version "1.9.1"
741 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
742 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
743 |
744 | js-sha3@0.8.0:
745 | version "0.8.0"
746 | resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
747 | integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
748 |
749 | jsonwebtoken@^8.5.1:
750 | version "8.5.1"
751 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
752 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
753 | dependencies:
754 | jws "^3.2.2"
755 | lodash.includes "^4.3.0"
756 | lodash.isboolean "^3.0.3"
757 | lodash.isinteger "^4.0.4"
758 | lodash.isnumber "^3.0.3"
759 | lodash.isplainobject "^4.0.6"
760 | lodash.isstring "^4.0.1"
761 | lodash.once "^4.0.0"
762 | ms "^2.1.1"
763 | semver "^5.6.0"
764 |
765 | jwa@^1.4.1:
766 | version "1.4.1"
767 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
768 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
769 | dependencies:
770 | buffer-equal-constant-time "1.0.1"
771 | ecdsa-sig-formatter "1.0.11"
772 | safe-buffer "^5.0.1"
773 |
774 | jws@^3.2.2:
775 | version "3.2.2"
776 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
777 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
778 | dependencies:
779 | jwa "^1.4.1"
780 | safe-buffer "^5.0.1"
781 |
782 | kareem@2.4.1:
783 | version "2.4.1"
784 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.4.1.tgz#7d81ec518204a48c1cb16554af126806c3cd82b0"
785 | integrity sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA==
786 |
787 | lodash.includes@^4.3.0:
788 | version "4.3.0"
789 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
790 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==
791 |
792 | lodash.isboolean@^3.0.3:
793 | version "3.0.3"
794 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
795 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==
796 |
797 | lodash.isinteger@^4.0.4:
798 | version "4.0.4"
799 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
800 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==
801 |
802 | lodash.isnumber@^3.0.3:
803 | version "3.0.3"
804 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
805 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==
806 |
807 | lodash.isplainobject@^4.0.6:
808 | version "4.0.6"
809 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
810 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
811 |
812 | lodash.isstring@^4.0.1:
813 | version "4.0.1"
814 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
815 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==
816 |
817 | lodash.once@^4.0.0:
818 | version "4.1.1"
819 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
820 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==
821 |
822 | media-typer@0.3.0:
823 | version "0.3.0"
824 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
825 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
826 |
827 | memory-pager@^1.0.2:
828 | version "1.5.0"
829 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"
830 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
831 |
832 | merge-descriptors@1.0.1:
833 | version "1.0.1"
834 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
835 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
836 |
837 | methods@~1.1.2:
838 | version "1.1.2"
839 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
840 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
841 |
842 | mime-db@1.52.0:
843 | version "1.52.0"
844 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
845 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
846 |
847 | mime-types@~2.1.24, mime-types@~2.1.34:
848 | version "2.1.35"
849 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
850 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
851 | dependencies:
852 | mime-db "1.52.0"
853 |
854 | mime@1.6.0:
855 | version "1.6.0"
856 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
857 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
858 |
859 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
860 | version "1.0.1"
861 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
862 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
863 |
864 | minimalistic-crypto-utils@^1.0.1:
865 | version "1.0.1"
866 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
867 | integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
868 |
869 | mongodb-connection-string-url@^2.5.2:
870 | version "2.5.2"
871 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz#f075c8d529e8d3916386018b8a396aed4f16e5ed"
872 | integrity sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==
873 | dependencies:
874 | "@types/whatwg-url" "^8.2.1"
875 | whatwg-url "^11.0.0"
876 |
877 | mongodb@4.7.0:
878 | version "4.7.0"
879 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.7.0.tgz#99f7323271d93659067695b60e7b4efee2de9bf0"
880 | integrity sha512-HhVar6hsUeMAVlIbwQwWtV36iyjKd9qdhY+s4wcU8K6TOj4Q331iiMy+FoPuxEntDIijTYWivwFJkLv8q/ZgvA==
881 | dependencies:
882 | bson "^4.6.3"
883 | denque "^2.0.1"
884 | mongodb-connection-string-url "^2.5.2"
885 | socks "^2.6.2"
886 | optionalDependencies:
887 | saslprep "^1.0.3"
888 |
889 | mongoose@^6.4.0:
890 | version "6.4.0"
891 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.4.0.tgz#22d6ab436bdf444b833e92faaa53e47b734c15c6"
892 | integrity sha512-eBDrueap1Zx3qFrcYylTiqTFlL5iTEaYAxoDF1MSRdipwAzChQRMJve+vxHtxPhI2q5tmf9RYHfZwXfTUHPd3g==
893 | dependencies:
894 | bson "^4.6.2"
895 | kareem "2.4.1"
896 | mongodb "4.7.0"
897 | mpath "0.9.0"
898 | mquery "4.0.3"
899 | ms "2.1.3"
900 | sift "16.0.0"
901 |
902 | mpath@0.9.0:
903 | version "0.9.0"
904 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904"
905 | integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==
906 |
907 | mquery@4.0.3:
908 | version "4.0.3"
909 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d"
910 | integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==
911 | dependencies:
912 | debug "4.x"
913 |
914 | ms@2.0.0:
915 | version "2.0.0"
916 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
917 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
918 |
919 | ms@2.1.2:
920 | version "2.1.2"
921 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
922 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
923 |
924 | ms@2.1.3, ms@^2.1.1:
925 | version "2.1.3"
926 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
927 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
928 |
929 | negotiator@0.6.3:
930 | version "0.6.3"
931 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
932 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
933 |
934 | object-assign@^4:
935 | version "4.1.1"
936 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
937 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
938 |
939 | object-inspect@^1.9.0:
940 | version "1.12.2"
941 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
942 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
943 |
944 | on-finished@2.4.1:
945 | version "2.4.1"
946 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
947 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
948 | dependencies:
949 | ee-first "1.1.1"
950 |
951 | parseurl@~1.3.3:
952 | version "1.3.3"
953 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
954 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
955 |
956 | path-to-regexp@0.1.7:
957 | version "0.1.7"
958 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
959 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
960 |
961 | proxy-addr@~2.0.7:
962 | version "2.0.7"
963 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
964 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
965 | dependencies:
966 | forwarded "0.2.0"
967 | ipaddr.js "1.9.1"
968 |
969 | punycode@^2.1.1:
970 | version "2.1.1"
971 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
972 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
973 |
974 | qs@6.10.3:
975 | version "6.10.3"
976 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
977 | integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
978 | dependencies:
979 | side-channel "^1.0.4"
980 |
981 | range-parser@~1.2.1:
982 | version "1.2.1"
983 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
984 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
985 |
986 | raw-body@2.5.1:
987 | version "2.5.1"
988 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
989 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
990 | dependencies:
991 | bytes "3.1.2"
992 | http-errors "2.0.0"
993 | iconv-lite "0.4.24"
994 | unpipe "1.0.0"
995 |
996 | safe-buffer@5.2.1, safe-buffer@^5.0.1:
997 | version "5.2.1"
998 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
999 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1000 |
1001 | "safer-buffer@>= 2.1.2 < 3":
1002 | version "2.1.2"
1003 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1004 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1005 |
1006 | saslprep@^1.0.3:
1007 | version "1.0.3"
1008 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
1009 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
1010 | dependencies:
1011 | sparse-bitfield "^3.0.3"
1012 |
1013 | scrypt-js@3.0.1:
1014 | version "3.0.1"
1015 | resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
1016 | integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
1017 |
1018 | semver@^5.6.0:
1019 | version "5.7.1"
1020 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1021 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1022 |
1023 | send@0.18.0:
1024 | version "0.18.0"
1025 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
1026 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
1027 | dependencies:
1028 | debug "2.6.9"
1029 | depd "2.0.0"
1030 | destroy "1.2.0"
1031 | encodeurl "~1.0.2"
1032 | escape-html "~1.0.3"
1033 | etag "~1.8.1"
1034 | fresh "0.5.2"
1035 | http-errors "2.0.0"
1036 | mime "1.6.0"
1037 | ms "2.1.3"
1038 | on-finished "2.4.1"
1039 | range-parser "~1.2.1"
1040 | statuses "2.0.1"
1041 |
1042 | serve-static@1.15.0:
1043 | version "1.15.0"
1044 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
1045 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
1046 | dependencies:
1047 | encodeurl "~1.0.2"
1048 | escape-html "~1.0.3"
1049 | parseurl "~1.3.3"
1050 | send "0.18.0"
1051 |
1052 | setprototypeof@1.2.0:
1053 | version "1.2.0"
1054 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
1055 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
1056 |
1057 | side-channel@^1.0.4:
1058 | version "1.0.4"
1059 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
1060 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
1061 | dependencies:
1062 | call-bind "^1.0.0"
1063 | get-intrinsic "^1.0.2"
1064 | object-inspect "^1.9.0"
1065 |
1066 | sift@16.0.0:
1067 | version "16.0.0"
1068 | resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.0.tgz#447991577db61f1a8fab727a8a98a6db57a23eb8"
1069 | integrity sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==
1070 |
1071 | smart-buffer@^4.2.0:
1072 | version "4.2.0"
1073 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
1074 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
1075 |
1076 | socks@^2.6.2:
1077 | version "2.6.2"
1078 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a"
1079 | integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==
1080 | dependencies:
1081 | ip "^1.1.5"
1082 | smart-buffer "^4.2.0"
1083 |
1084 | sparse-bitfield@^3.0.3:
1085 | version "3.0.3"
1086 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
1087 | integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==
1088 | dependencies:
1089 | memory-pager "^1.0.2"
1090 |
1091 | statuses@2.0.1:
1092 | version "2.0.1"
1093 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
1094 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
1095 |
1096 | toidentifier@1.0.1:
1097 | version "1.0.1"
1098 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
1099 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
1100 |
1101 | tr46@^3.0.0:
1102 | version "3.0.0"
1103 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
1104 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
1105 | dependencies:
1106 | punycode "^2.1.1"
1107 |
1108 | type-is@~1.6.18:
1109 | version "1.6.18"
1110 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
1111 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
1112 | dependencies:
1113 | media-typer "0.3.0"
1114 | mime-types "~2.1.24"
1115 |
1116 | unpipe@1.0.0, unpipe@~1.0.0:
1117 | version "1.0.0"
1118 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
1119 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
1120 |
1121 | utils-merge@1.0.1:
1122 | version "1.0.1"
1123 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
1124 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
1125 |
1126 | vary@^1, vary@~1.1.2:
1127 | version "1.1.2"
1128 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
1129 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
1130 |
1131 | webidl-conversions@^7.0.0:
1132 | version "7.0.0"
1133 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
1134 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
1135 |
1136 | whatwg-url@^11.0.0:
1137 | version "11.0.0"
1138 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
1139 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
1140 | dependencies:
1141 | tr46 "^3.0.0"
1142 | webidl-conversions "^7.0.0"
1143 |
1144 | ws@7.4.6:
1145 | version "7.4.6"
1146 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
1147 | integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
1148 |
--------------------------------------------------------------------------------