diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..57e4035f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +node_modules + +.git +.github + +dist +.env* +docker-compose.yml +Dockerfile +*.md +claudia.* diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml new file mode 100644 index 00000000..b4c8b27c --- /dev/null +++ b/.github/workflows/build-docker.yml @@ -0,0 +1,94 @@ +name: build-docker-image + +on: + push: + branches: + - 'main' + tags: + - 'v*' + pull_request: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + # qemu and buildx are for multi-platform images and caching + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + # set up local caching + - name: Cache Docker layers + uses: actions/cache@v3 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: | + verida/storage-node + ghcr.io/verida/storage-node + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha + + # get the correct AW role to push image to ECR + - name: Configure AWS credentials from Testnet account + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + role-duration-seconds: 1500 + role-to-assume: arn:aws:iam::737954963756:role/github-testnet-deploy-role + aws-region: us-east-1 + + # login to push to DockerHub + - name: Login to DockerHub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # login to push to GHCR + - name: Login to GHCR + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + platforms: linux/amd64 # ,linux/arm64,linux/arm/v7 + context: . + push: ${{ github.event_name != 'pull_request' }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max + tags: ${{ steps.meta.output.tags }} + labels: ${{ steps.meta.output.labels }} + + # Temp fix + # https://github.com/docker/build-push-action/issues/252 + # https://github.com/moby/buildkit/issues/1896 + - name: Move cache + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache diff --git a/.gitignore b/.gitignore index cb1ff751..4cdd09e8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ dist .DS_Store .vscode curl_tests +dbdata .env -.env* \ No newline at end of file +.env* diff --git a/.nvmrc b/.nvmrc index 2831228e..a3eb5a03 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.17.1 +14.20.0 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..8cfaab1e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +FROM node:14.20.0-slim as node +FROM ubuntu:focal-20220531 as base +COPY --from=node /usr/local/include/ /usr/local/include/ +COPY --from=node /usr/local/lib/ /usr/local/lib/ +COPY --from=node /usr/local/bin/ /usr/local/bin/ + +ENV NODE_ENV=production +EXPOSE 5000 + +RUN groupadd --gid 1000 node \ + && useradd --uid 1000 --gid node --shell /bin/bash --create-home node +RUN mkdir /storage-node && chown -R node:node /storage-node +WORKDIR /storage-node + +FROM base as build +# this ensures we fix simlinks for npx and yarn +RUN corepack disable && corepack enable + +RUN apt-get update \ + && apt-get -qq install -y --no-install-recommends \ + git ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +USER node +COPY --chown=node:node package.json yarn.lock ./ +RUN yarn install --prod --frozen-lockfile + +FROM base as source +COPY --from=build --chown=node:node /storage-node/node_modules ./node_modules +COPY . . + +### prod stage +# Note: use --init option when running the container to have better signal forwarding +FROM source as prod +CMD ["node", "./src/server.js"] diff --git a/README.md b/README.md index e1741245..1f70a88e 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,9 @@ DO NOT include ` {chttpd_auth, default_authentication_handler}` in the authentic Learn more here: https://stackoverflow.com/questions/32670580/prevent-authentication-popup-401-with-couchdb-pouchdb ``` +[couchdb] +single_node=true + [chttpd] authentication_handlers = {chttpd_auth, jwt_authentication_handler}, {chttpd_auth, cookie_authentication_handler} enable_cors = false @@ -145,6 +148,18 @@ See the [Claudia Docs for information](https://claudiajs.com/news/2016/11/24/cla Verida staff can see the [internal Verida repo]( https://github.com/verida/infrastructure/blob/develop/storage_node.md) for docs on this. +## Docker + +You can spin up storage node API on your machine with Docker: +```shell +docker run --init --env-file=.env verida/storage-node:latest +``` + +Using the example [docker-compose.yml](./docker-compose.yml) you can run storage node together with CouchDB. +```shell +docker compose up +``` + ## Tests Run tests with `yarn run tests` @@ -154,4 +169,4 @@ Note: The tests in `server.js` require the server to be running locally. The oth Common issues when running tests: 1. `Bad key`: The key in CouchDB configuration for `jwt_keys/hmac:_default` is not a valid Base64 encoded key -2. `HMAC error`: The key in CouchDB configuration for `jwt_keys/hmac:_default` does not match `ACCESS_JWT_SIGN_PK` in `.env` \ No newline at end of file +2. `HMAC error`: The key in CouchDB configuration for `jwt_keys/hmac:_default` does not match `ACCESS_JWT_SIGN_PK` in `.env` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..80aa9863 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,23 @@ +services: + couchdb: + image: couchdb + restart: always + ports: + - "5984:5984" + environment: + - COUCHDB_USER=${DB_USER} + - COUCHDB_PASSWORD=${DB_PASS} + volumes: + - ./dbdata:/opt/couchdb/data + + storage-node: + build: . + ports: + - "5000:5000" + environment: + PORT: 5000 + DB_HOST: couchdb + restart: on-failure + init: true + env_file: + - .env diff --git a/package.json b/package.json index ec837640..aa6111b0 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "homepage": "https://github.com/verida/storage-node/README.md", "dependencies": { "@babel/runtime": "^7.16.7", - "@verida/did-client": "^2.0.0-rc2", + "@verida/did-client": "^2.0.0-rc3", "@verida/encryption-utils": "^2.0.0-rc1", "aws-serverless-express": "^3.4.0", "cors": "^2.8.5", @@ -81,7 +81,6 @@ "babel-polyfill": "^6.26.0", "babel-preset-es2015": "^6.24.1", "babel-preset-stage-0": "^6.24.1", - "body-parser": "^1.19.2", "claudia": "^5.14.1", "mocha": "^7.0.0", "nodemon": "^2.0.14", diff --git a/sample.env b/sample.env index fbb9e6b3..1137169f 100644 --- a/sample.env +++ b/sample.env @@ -1,17 +1,17 @@ HASH_KEY=this_is_not_the_prod_hash_key -DID_RPC_URL="" -DID_NETWORK="testnet" +DID_RPC_URL= +DID_NETWORK=testnet DID_CACHE_DURATION=3600 -DB_PROTOCOL="http" -DB_USER="admin" -DB_PASS="admin" -DB_HOST="localhost" +DB_PROTOCOL=http +DB_USER=admin +DB_PASS=admin +DB_HOST=localhost DB_PORT=5984 DB_REJECT_UNAUTHORIZED_SSL=true -ACCESS_JWT_SIGN_PK="insert-random-access-symmetric-key" +ACCESS_JWT_SIGN_PK=insert-random-access-symmetric-key # 5 Minutes ACCESS_TOKEN_EXPIRY=300 -REFRESH_JWT_SIGN_PK="insert-random-refresh-symmetric-key" +REFRESH_JWT_SIGN_PK=insert-random-refresh-symmetric-key # 30 Days REFRESH_TOKEN_EXPIRY=2592000 DB_REFRESH_TOKENS="verida_refresh_tokens" @@ -20,7 +20,7 @@ DB_DB_INFO="verida_db_info" GC_PERCENT=0.1 // alpha numeric only -DB_PUBLIC_USER="784c2n780c9cn0789" -DB_PUBLIC_PASS="784c2n780c9cn0789" +DB_PUBLIC_USER=784c2n780c9cn0789 +DB_PUBLIC_PASS=784c2n780c9cn0789 -PORT=5151 \ No newline at end of file +PORT=5151 diff --git a/src/components/authManager.js b/src/components/authManager.js index ba2b211b..c67332e2 100644 --- a/src/components/authManager.js +++ b/src/components/authManager.js @@ -1,12 +1,14 @@ -require('dotenv').config(); -const randtoken = require('rand-token'); -const jwt = require('jsonwebtoken'); -const mcache = require("memory-cache") +import dotenv from 'dotenv'; +import randtoken from 'rand-token'; +import jwt from 'jsonwebtoken'; +import mcache from 'memory-cache'; import { DIDClient } from '@verida/did-client' import EncryptionUtils from '@verida/encryption-utils'; -import Utils from "./utils"; -import Db from "./db"; +import Utils from './utils.js'; +import Db from './db.js'; + +dotenv.config(); let didClient diff --git a/src/components/db.js b/src/components/db.js index 22d7785b..566ffdf6 100644 --- a/src/components/db.js +++ b/src/components/db.js @@ -1,5 +1,7 @@ -require('dotenv').config(); -const CouchDb = require('nano'); +import dotenv from 'dotenv'; +import CouchDb from 'nano'; + +dotenv.config(); class Db { @@ -9,7 +11,7 @@ class Db { this._couch = new CouchDb({ url: dsn, requestDefaults: { - rejectUnauthorized: process.env.DB_REJECT_UNAUTHORIZED_SSL.toLowerCase() != "false" + rejectUnauthorized: process.env.DB_REJECT_UNAUTHORIZED_SSL.toLowerCase() !== "false" } }); } diff --git a/src/components/dbManager.js b/src/components/dbManager.js index 2d3043dd..f8003771 100644 --- a/src/components/dbManager.js +++ b/src/components/dbManager.js @@ -1,7 +1,6 @@ -require('dotenv').config(); -import Utils from './utils'; +import Utils from './utils.js'; import _ from 'lodash'; -import Db from "./db" +import Db from "./db.js" import EncryptionUtils from "@verida/encryption-utils" class DbManager { @@ -113,7 +112,6 @@ class DbManager { async createDatabase(username, databaseName, applicationName, options) { let couch = Db.getCouch(); - let response; // Create database try { await couch.db.create(databaseName); @@ -247,12 +245,12 @@ class DbManager { await this._insertOrUpdate(db, writeDoc, '_design/only_permit_write_users'); } catch (err) { // CouchDB throws a document update conflict without any obvious reason - if (err.reason != "Document update conflict.") { + if (err.reason !== "Document update conflict.") { throw err; } } - if (permissions.write == "public") { + if (permissions.write === "public") { // If the public has write permissions, disable public from deleting records try { const deleteFunction = "\n function(newDoc, oldDoc, userCtx, secObj) {\n if ("+deleteUsersJson+".indexOf(userCtx.name) == -1 && newDoc._deleted) throw({ unauthorized: 'User is not permitted to delete from database' });\n}"; diff --git a/src/components/userManager.js b/src/components/userManager.js index fbaa4fbd..1b9326cb 100644 --- a/src/components/userManager.js +++ b/src/components/userManager.js @@ -1,7 +1,7 @@ import crypto from 'crypto'; -const jwt = require('jsonwebtoken') -import Db from "./db" -import AuthManager from './authManager'; +//import jwt from 'jsonwebtoken'; +import Db from './db.js' +//import AuthManager from './authManager.js'; class UserManager { @@ -77,7 +77,7 @@ class UserManager { try { await usersDb.insert(userData); } catch (err) { - if (err.error == "conflict") { + if (err.error === "conflict") { console.log("Public user not created -- already existed"); } else { throw err; diff --git a/src/components/utils.js b/src/components/utils.js index f067a7de..28d88469 100644 --- a/src/components/utils.js +++ b/src/components/utils.js @@ -1,4 +1,3 @@ - import EncryptionUtils from "@verida/encryption-utils" class Utils { diff --git a/src/controllers/auth.js b/src/controllers/auth.js index 71439aa5..09c37cb8 100644 --- a/src/controllers/auth.js +++ b/src/controllers/auth.js @@ -1,7 +1,7 @@ -import UserManager from '../components/userManager'; -import Utils from "../components/utils"; -import AuthManager from "../components/authManager" -import Db from "../components/db" +import UserManager from '../components/userManager.js'; +import Utils from '../components/utils.js'; +import AuthManager from '../components/authManager.js'; +import Db from '../components/db.js'; class AuthController { diff --git a/src/controllers/user.js b/src/controllers/user.js index f9112701..ecb00f11 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -1,6 +1,6 @@ -import DbManager from '../components/dbManager'; -import Utils from "../components/utils"; -import Db from "../components/db" +import DbManager from '../components/dbManager.js'; +import Utils from '../components/utils.js'; +import Db from '../components/db.js' class UserController { diff --git a/src/middleware/requestValidator.js b/src/middleware/requestValidator.js index 362fdf99..da3941c9 100644 --- a/src/middleware/requestValidator.js +++ b/src/middleware/requestValidator.js @@ -1,4 +1,4 @@ -import AuthManager from "../components/authManager" +import AuthManager from '../components/authManager.js' export default async function requestValidator(req, res, next) { const authHeader = req.headers.authorization; diff --git a/src/routes/index.js b/src/routes/index.js index 83e1b37c..71daa813 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,5 +1,5 @@ import express from 'express'; -import UserController from '../controllers/user'; +import UserController from '../controllers/user.js'; const router = express.Router(); diff --git a/src/server-app.js b/src/server-app.js index 8447ed8f..e53616b1 100644 --- a/src/server-app.js +++ b/src/server-app.js @@ -1,13 +1,16 @@ import express from 'express'; import cors from 'cors'; -import bodyParser from 'body-parser'; +import dotenv from 'dotenv'; +import basicAuth from 'express-basic-auth'; + import router from './routes/index.js'; import requestValidator from './middleware/requestValidator.js'; -import userManager from './components/userManager'; -import AuthController from './controllers/auth'; -import UserController from './controllers/user'; -import AuthManager from './components/authManager'; -require('dotenv').config(); +import userManager from './components/userManager.js'; +import UserController from './controllers/user.js'; +import AuthController from './controllers/auth.js'; +import AuthManager from './components/authManager.js'; + +dotenv.config(); // Set up the express app const app = express(); @@ -18,8 +21,8 @@ let corsConfig = { // Parse incoming requests data app.use(cors(corsConfig)); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: false })); +app.use(express.urlencoded({ extended: false })); +app.use(express.json()); // Specify public endpoints app.get('/auth/public', UserController.getPublic); @@ -36,5 +39,4 @@ app.use(router); AuthManager.initDb(); userManager.ensureDefaultDatabases(); - -module.exports=app \ No newline at end of file +export default app; diff --git a/src/server.js b/src/server.js index 1eaf3091..17e645fe 100644 --- a/src/server.js +++ b/src/server.js @@ -1,4 +1,4 @@ -const app = require('./server-app'); +import app from './server-app.js'; const PORT = process.env.PORT ? process.env.PORT : 5000; app.listen(PORT, () => { diff --git a/test/auth-manager.js b/test/auth-manager.js index eab726d2..49bdbada 100644 --- a/test/auth-manager.js +++ b/test/auth-manager.js @@ -1,11 +1,12 @@ -var assert = require("assert"); -require('dotenv').config(); -const jwt = require('jsonwebtoken'); +import dotenv from 'dotenv'; +import assert from 'assert'; +import jwt from 'jsonwebtoken'; -import AuthManager from "../src/components/authManager"; -import TestUtils from "./utils" +dotenv.config(); -import CONFIG from './config' +import AuthManager from '../src/components/authManager.js'; +import TestUtils from './utils.js' +import CONFIG from './config.js' const { CONTEXT_NAME } = CONFIG diff --git a/test/config.js b/test/config.js index 8bea75ab..de934218 100644 --- a/test/config.js +++ b/test/config.js @@ -1,5 +1,7 @@ import { EnvironmentType } from "@verida/account" -require('dotenv').config(); +import dotenv from 'dotenv'; + +dotenv.config(); export default { DID_CLIENT_CONFIG: { diff --git a/test/permissions.js b/test/permissions.js index 05b9a02f..6ab545ed 100644 --- a/test/permissions.js +++ b/test/permissions.js @@ -1,13 +1,15 @@ -var assert = require("assert"); -require('dotenv').config(); - -const PouchDb = require('pouchdb'); -import AuthManager from "../src/components/authManager" -import DbManager from "../src/components/dbManager"; -import UserManager from "../src/components/userManager"; -import Db from "../src/components/db"; -import Utils from "../src/components/utils"; -import TestUtils from "./utils"; +import assert from 'assert'; +import dotenv from 'dotenv'; + +import PouchDb from 'pouchdb'; +import AuthManager from '../src/components/authManager.js'; +import DbManager from '../src/components/dbManager.js'; +import UserManager from '../src/components/userManager.js'; +import Db from '../src/components/db.js'; +import Utils from '../src/components/utils.js'; +import TestUtils from './utils.js'; + +dotenv.config(); const PRIVATE_KEYS = { ownerUser: '0x0003b996ec98a9a536efdffbae40e5eaaf117765a587483c69195c9460165000', diff --git a/test/server.js b/test/server.js index f71b1cd4..ea763638 100644 --- a/test/server.js +++ b/test/server.js @@ -1,6 +1,5 @@ -var assert = require("assert"); -require('dotenv').config(); -const jwt = require('jsonwebtoken'); +import assert from 'assert'; +import dotenv from 'dotenv'; import Axios from 'axios' import AuthManager from "../src/components/authManager"; @@ -8,6 +7,8 @@ import TestUtils from "./utils" import CONFIG from './config' +dotenv.config(); + const { CONTEXT_NAME, SERVER_URL, TEST_DEVICE_ID } = CONFIG let authJwt, accountInfo, authRequestId diff --git a/test/utils.js b/test/utils.js index 80c5a8a2..4616cc55 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,9 +1,9 @@ import Axios from 'axios' -const PouchDb = require('pouchdb'); +import PouchDb from 'pouchdb' import { AutoAccount } from "@verida/account-node" import { Network } from "@verida/client-ts" -import CONFIG from './config' +import CONFIG from './config.js' class Utils { diff --git a/yarn.lock b/yarn.lock index e39376fd..48171b9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1677,6 +1677,19 @@ deepcopy "^2.1.0" ethers "^5.5.1" +"@verida/did-client@^2.0.0-rc3": + version "2.0.0-rc3" + resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.0.0-rc3.tgz#b3b5165fe76d5479deed9cab059ac6a28a01b08e" + integrity sha512-3IULtenrXBk8StAXSH2fN54lIKsbKwIEjocZDamSvkrd0oXtc2guwnonJIBB63tjbfd1JmteX/+ciLV5sjCrMg== + dependencies: + "@verida/did-document" "^2.0.0-rc3" + "@verida/vda-did" "^2.0.0-rc3" + "@verida/vda-did-resolver" "^2.0.0-rc3" + "@verida/web3" "^2.0.0-rc3" + axios "^0.23.0" + deepcopy "^2.1.0" + ethers "^5.5.1" + "@verida/did-document@^2.0.0-rc1": version "2.0.0-rc1" resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.0.0-rc1.tgz#38ec512e4a1d27433de10fc9c8e158bdf43960e8" @@ -1702,6 +1715,19 @@ ethers "^5.7.2" lodash "^4.17.21" +"@verida/did-document@^2.0.0-rc3": + version "2.0.0-rc3" + resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.0.0-rc3.tgz#897b99ecca2a074dfe09163af8007584fb6a7566" + integrity sha512-zKWewLM+q1qe00/cyEuv5hRUMRxnMSAoMYyb3Byhndf0nGtkrwRl4qXNYYfEaTDkYxTC4haGsogjfX/dYQRjYQ== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@verida/encryption-utils" "^2.0.0-rc1" + "@verida/keyring" "^2.0.0-rc1" + "@verida/vda-did-resolver" "^2.0.0-rc3" + did-resolver "^3.1.2" + ethers "^5.7.2" + lodash "^4.17.21" + "@verida/encryption-utils@^2.0.0-rc1": version "2.0.0-rc1" resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.0.0-rc1.tgz#ad1eb6c5001d59930f87b2d7c0272cfe1b8c3196" @@ -1781,6 +1807,24 @@ did-resolver "^3.1.5" ethers "^5.7.0" +"@verida/vda-did-resolver@^2.0.0-rc3": + version "2.0.0-rc3" + resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.0.0-rc3.tgz#6d19a49c8e35cf0a55d97290e8438b89968cb34e" + integrity sha512-Ofh9OytgazFy3Oq3Y+wOZHY2z1h4s3i8cDpPGFhkvYs9oLZFgjF6EVfjOgU2WiAth8qEceVNg2ehbi7oP02H+Q== + dependencies: + "@ethersproject/abi" "^5.5.0" + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/basex" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/contracts" "^5.5.0" + "@ethersproject/providers" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@verida/encryption-utils" "^2.0.0-rc1" + "@verida/web3" "^2.0.0-rc3" + did-resolver "^3.1.5" + ethers "^5.7.0" + "@verida/vda-did@^2.0.0-rc2": version "2.0.0-rc2" resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.0.0-rc2.tgz#8318fcbad16a3cf133643f600e15d86a4d68bfa7" @@ -1798,6 +1842,23 @@ "@verida/vda-did-resolver" "^2.0.0-rc2" did-jwt "^5.12.3" +"@verida/vda-did@^2.0.0-rc3": + version "2.0.0-rc3" + resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.0.0-rc3.tgz#69bd5cf13096794c8a0ecf1b03782b58d23ae45b" + integrity sha512-28uKuVGqHWC+uEt7kprH1AmZxs8sIAKk/jcsRYBjR6fLjsEP/yL7vS6gbVyraaaYcK76ybuo3tmPhShNZr0Meg== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/base64" "^5.5.0" + "@ethersproject/basex" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/providers" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/wallet" "^5.5.0" + "@verida/vda-did-resolver" "^2.0.0-rc3" + did-jwt "^5.12.3" + "@verida/web3@^2.0.0-rc1": version "2.0.0-rc1" resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.0.0-rc1.tgz#0f63b455120306d9b920a232bc87367355af6f15" @@ -1814,6 +1875,14 @@ axios "^0.27.2" ethers "^5.7.0" +"@verida/web3@^2.0.0-rc3": + version "2.0.0-rc3" + resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.0.0-rc3.tgz#04f2d6e2b581fd6fbf63a0582c906bc78bbfeed5" + integrity sha512-l2SRpYegEqgRMSoe0Z9F2D4+jn3kO9zC4INpWdxnoL3IV09dsK0AHOkL8L/zj9BJWczVGBpix6R7CAgVj1RKJQ== + dependencies: + axios "^0.27.2" + ethers "^5.7.0" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -2892,7 +2961,7 @@ bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.0, body-parser@^1.19.2: +body-parser@1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==