From 5347a10ab4e25c0b1e1e0af780f85497c41d3d7d Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 2 Mar 2023 21:43:58 +1030 Subject: [PATCH 01/33] Update to latest protocol. Add SBT client dependency. --- package.json | 13 ++- yarn.lock | 314 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 235 insertions(+), 92 deletions(-) diff --git a/package.json b/package.json index 4543d8b7..6f338a08 100644 --- a/package.json +++ b/package.json @@ -26,11 +26,14 @@ }, "homepage": "https://github.com/verida/server-template#readme", "dependencies": { - "@verida/account-node": "^2.0.0", - "@verida/client-ts": "^2.0.1", - "@verida/did-client": "^2.0.0", - "@verida/encryption-utils": "^2.0.0", - "@verida/web3": "^2.0.0", + "@verida/account-node": "^2.1.3", + "@verida/client-ts": "^2.1.3", + "@verida/did-client": "^2.1.3", + "@verida/encryption-utils": "^2.1.3", + "@verida/types": "^2.1.3", + "@verida/vda-sbt-client": "^2.1.3", + "@verida/verifiable-credentials": "^2.1.3", + "@verida/web3": "^2.1.3", "aws-serverless-express": "^3.4.0", "axios": "^1.2.3", "body-parser": "^1.19.0", diff --git a/yarn.lock b/yarn.lock index 817be3d1..29eea849 100644 --- a/yarn.lock +++ b/yarn.lock @@ -471,7 +471,7 @@ resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== -"@stablelib/x25519@^1.0.1": +"@stablelib/x25519@^1.0.1", "@stablelib/x25519@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== @@ -637,43 +637,47 @@ binary-case "^1.0.0" type-is "^1.6.16" -"@verida/account-node@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.0.0.tgz#12ed285280cac73aa1ceb41bf651495628b337ae" - integrity sha512-6CDDvF4tje1Bh9p6KSKG6QwlL+rNSSQxEKMnzNHgrtVkUeJIAXW5tQuhk9gI1TVgekMynprjNpEwgdTFWPHcJw== - dependencies: - "@verida/account" "^2.0.0" - "@verida/did-client" "^2.0.0" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" +"@verida/account-node@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.1.3.tgz#4f4d10a1f9a5dbd9b4bfd19a2cbe191dbf1cc268" + integrity sha512-/G3iHxNoP23l0iGjF5zMxgfkZSrkqnHjYuVbK+8EoKGnBIr4L4ibZIAi09plMoIZWSaFPpMjmJdddLDIYL3gtQ== + dependencies: + "@verida/account" "^2.1.3" + "@verida/did-client" "^2.1.3" + "@verida/did-document" "^2.1.3" + "@verida/encryption-utils" "^2.1.3" + "@verida/keyring" "^2.1.3" + "@verida/types" "^2.1.3" axios "^0.27.2" did-resolver "^4.0.1" -"@verida/account@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.0.0.tgz#fc7e853dbfc20e18744f9bb10dad75cc05fbed0a" - integrity sha512-N5WRTUyEYQ113TLMDNMwZNPJcvqeqWCXI1G2tQZz4fR5rg3haLhfnIgqe2bSAsiIT6yTRizWjqwekPi7TCSAkQ== +"@verida/account@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.1.3.tgz#a533915e208b44210470e9062580d5589a6566ed" + integrity sha512-6/wlhrNq88ckyn8W8gI815zRvpG8PJvmct4yZQZg3KBVV7c2uUy+bM/CXqRCN49wixquXJAYRtSt6hyVImhydQ== dependencies: - "@verida/keyring" "^2.0.0" - "@verida/storage-link" "^2.0.0" - did-jwt "5.7.0" + "@verida/keyring" "^2.1.3" + "@verida/storage-link" "^2.1.3" + "@verida/types" "^2.1.3" + did-jwt "^6.11.0" did-resolver "^4.0.1" lodash "^4.17.21" tweetnacl-util "^0.15.1" -"@verida/client-ts@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.0.1.tgz#a64cc733578da849b319c72e726e0710afb44c32" - integrity sha512-ZqFDouGUYszKn4a56pCmnMZehwbH1TPPV5yXbtlAVXjnSqbw06RDlue8HlfbYNiECPAGgQ5KQO+ZFTVwz/UtRA== - dependencies: - "@verida/account" "^2.0.0" - "@verida/account-node" "^2.0.0" - "@verida/did-client" "^2.0.0" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" - "@verida/storage-link" "^2.0.0" +"@verida/client-ts@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.1.3.tgz#7538083613829b1bcf6eedb5789640c77f342094" + integrity sha512-7Vpg2Bef80NHr4CkD1RlApi6VAz2Bgig9IFDB8dlj1mlkWkTW5Ngzd7fIdDzsw/CB6Okhw5Aav2W8WXWKNsq/w== + dependencies: + "@verida/account" "^2.1.3" + "@verida/account-node" "^2.1.3" + "@verida/did-client" "^2.1.3" + "@verida/did-document" "^2.1.3" + "@verida/encryption-utils" "^2.1.3" + "@verida/keyring" "^2.1.3" + "@verida/storage-link" "^2.1.3" + "@verida/types" "^2.1.3" + "@verida/vda-name-client" "^2.1.3" ajv "^8.6.3" ajv-formats "^2.1.1" axios "^0.21.2" @@ -688,93 +692,155 @@ pouchdb-find "^7.2.2" uuid "^8.3.2" -"@verida/did-client@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.0.0.tgz#1da23e09ecfb1bd3306e96d34f9afcd65c7b8b9d" - integrity sha512-AAPej1qiloOb0mdm7S6SjVNzh19/2k2WIyumMu/LycuZr8nS6POl1VU40bCwovC5sGvW1Y5IE3b9k311JQ0n+A== +"@verida/did-client@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.1.3.tgz#cb5f9a1b99c2797d04578c585914fe57533efec2" + integrity sha512-SfG3RfaGRvrFuFoGUzDq6BQUioiy3kjJ9wMSQrnErQCg+yJIshOnK1EWcrzsmKzUDiBRwp0kXj6/LpYQ9fP/6w== dependencies: - "@verida/did-document" "^2.0.0" - "@verida/vda-did-resolver" "^2.0.0" - "@verida/web3" "^2.0.0" + "@verida/did-document" "^2.1.3" + "@verida/types" "^2.1.3" + "@verida/vda-did-resolver" "^2.1.3" + "@verida/web3" "^2.1.3" axios "^0.23.0" deepcopy "^2.1.0" + did-resolver "^4.0.1" ethers "^5.5.1" -"@verida/did-document@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.0.0.tgz#b921011579f906e743d953f6ffd96a1f55f3c505" - integrity sha512-9mzbA7PtylehPfAAPor0Gwtkf2+Li0Pv9NbGoT8vqdhNrvOiYTqaz8yhUa/JpqiygolIpo6XC0gUuSqglSpYaw== +"@verida/did-document@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.1.3.tgz#86dd9458f90e7d644fbb66d64f24885b730996d8" + integrity sha512-BZiTEey/f6U5WQ0iLXcolza9gye9A+A5oSO75xf2q0o7bPaIzC58X7jKsZQr/WbmTnwKQQqGdLaaPxy4LXEUAA== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" "@ethersproject/transactions" "^5.7.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" + "@verida/encryption-utils" "^2.1.3" + "@verida/keyring" "^2.1.3" + "@verida/types" "^2.1.3" did-resolver "^4.0.1" - ethers "^5.7.2" lodash "^4.17.21" -"@verida/encryption-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.0.0.tgz#996740206f776d65314dd1351d318b971872bf77" - integrity sha512-w1LY3KJWqmeTWHjKlXGjAnF4ghpeMfXvRe7d1QUoqOLk9p0vgRMGkWwYgqYfhtvkGhu9e5+Nrit9XTGewjbNXg== +"@verida/encryption-utils@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.1.3.tgz#7e98ad6400d8e83875d5c8682b778e828c65ae15" + integrity sha512-tFDxVNxIv1mFylm1CCeCNAT2F7hAKXcQeDJc0sJZqzzBZXeQMslAx9yVsD2Fh3tFstqc3E7ov2n3MjojlveuHQ== dependencies: ethers "^5.5.1" json.sortify "^2.2.2" tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@verida/keyring@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.0.0.tgz#31936030d8cdb78af2affdfe0d1b308af5de69dd" - integrity sha512-CiRDJKVQB4OIeEcc16Kkpx2gnWdWUT+BTnJUHuXB8qUmko/OaDFnV40qogl67sFGyslGptFgmIBkXITHa1MlhA== +"@verida/helpers@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.1.3.tgz#98865af4c1f267ec235e74b527e933fc32ac275d" + integrity sha512-sTeFm3PI4eUReNFKz1OksBHR1WAYnZBSHP9fcFz7PNhGNz5t+Dg4oAeb7qdqy+p6ghwAerREF5sGMfATHQN4Uw== + dependencies: + "@verida/encryption-utils" "^2.1.3" + "@verida/types" "^2.1.3" + bs58 "^5.0.0" + url "^0.11.0" + +"@verida/keyring@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.1.3.tgz#08bb0b6a253b4d034cc3f5ce20f6e5c65811682a" + integrity sha512-aqWBud5zU92NSSipZTG8b/sh/s6NKU+8vVJfyPvXI38Pzu8BNXgFo/oA6QUkjqVhKjwRh5PhZJ53RtjVv+Tt7A== dependencies: - "@verida/encryption-utils" "^2.0.0" + "@verida/encryption-utils" "^2.1.3" + "@verida/types" "^2.1.3" ethers "^5.5.1" tweetnacl "^1.0.3" uuid "^8.3.2" -"@verida/storage-link@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.0.0.tgz#942838a1d8a3a242401548f23f82af90c510135b" - integrity sha512-wqlLhV19+aJacNNunaTSJmN2JGmhzpIzhOY2dTJEWct7VDxXj6xObeCKTYOECGGpPOR6r3TSGAblCQahGrCc+g== +"@verida/storage-link@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.1.3.tgz#a8894c305746fefc3dd223eed125dc788bfdbee5" + integrity sha512-3Z72+h2MP0x0puDwBD01eGazvkfkZH1/i09E1QrLMKWPtjP7ecifiTlrMlZ+zl369OWG/60nCaavNEImfHWrzg== dependencies: - "@verida/did-client" "^2.0.0" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" + "@verida/did-client" "^2.1.3" + "@verida/did-document" "^2.1.3" + "@verida/encryption-utils" "^2.1.3" + "@verida/keyring" "^2.1.3" did-resolver "^4.0.0" url-parse "^1.5.3" -"@verida/vda-did-resolver@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.0.0.tgz#2c87755d7548f80852eccf97f166ba852517e204" - integrity sha512-8ZBF1JuxNHJCGpYMWKK844b/eYw5ncRZOb0Sj8rW/0wCNjVRFl8cucNhsy9Hp3g1jXDd9mwJBY/jdWzY1Vb0Rg== +"@verida/types@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/types/-/types-2.1.3.tgz#494e40ae4de4e211387b6e53f3d2fc9bf5626c23" + integrity sha512-wjetw7ssUPVn9G8xpuYe8yhLlISGBtl+BPom9x68sgIOCTClf9KbwlruiXr7fc8rwv5ro87X5LreI+GWChVgMA== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + did-resolver "^4.0.1" + tweetnacl "^1.0.3" + +"@verida/vda-did-resolver@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.1.3.tgz#6ca9c854642793a015cb1894630011b452c56eba" + integrity sha512-X2pXREKbX4ygTSzYJ7tU6lgYbWbJ/YMCu9GdZF0gSkhRU9nt4ibpSozZlmRTUwoECz7+V9YYP1n8nxvc2yBfnw== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/vda-did" "^2.0.0" + "@verida/did-document" "^2.1.3" + "@verida/encryption-utils" "^2.1.3" + "@verida/types" "^2.1.3" + "@verida/vda-did" "^2.1.3" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/vda-did@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.0.0.tgz#d650ead5faddd2d5b5eaa537863629ad17bf090e" - integrity sha512-ZYB4t0SdXu0SFUj1hucDd51ktrsI82aRWGyc013KrKIxfM18WjFeCWm7fln5pQt1GYnsXTq03nCtzACMBPCf4w== +"@verida/vda-did@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.1.3.tgz#beae18b2469194a6f1db893f596c2d7295557688" + integrity sha512-G5tqkMORo3poVdwG+PT2Evx1A0uI5BqqEDdRQg8ChtvqIlT1Z+vNs7ZuD1ptbEzjlBOiVGQAz4b2TmoqF0n93Q== dependencies: - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/vda-did-resolver" "^2.0.0" - "@verida/web3" "^2.0.0" + "@verida/did-document" "^2.1.3" + "@verida/encryption-utils" "^2.1.3" + "@verida/types" "^2.1.3" + "@verida/web3" "^2.1.3" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/web3@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.0.0.tgz#4023ddda769bb13e36d8f48ea3480f25abe84a87" - integrity sha512-+AqqaSgpeFrr12iPCdUiqEqvWa0dlHkN5AmJzrXHGktiBb7vPQxPRKu1dV2mOOhcsTV/grdVKwuB2ZV5/X4lAg== +"@verida/vda-name-client@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-2.1.3.tgz#d1c3bafac9af1e05072729ac4d905c0020b35c53" + integrity sha512-X2N6iYqPc3YnXEN2WDWVKRoXz0Y1Zpafj8oC+C/O4XGo+JjqZS9YDDwKxGk0aOJsuFDDVyHugsP2sjR52DSxYg== dependencies: + "@ethersproject/providers" "^5.7.2" + "@verida/web3" "^2.1.3" + axios "^0.27.2" + ethers "^5.7.0" + +"@verida/vda-sbt-client@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/vda-sbt-client/-/vda-sbt-client-2.1.3.tgz#de5507d3bfad229acf2719029d4097a173463760" + integrity sha512-PqSe/kuzl3cnY7DsqlK2Md0htexeJm/Pd+KyTGxFAMh3HQIW3PM9d0+HKucihzGJ/c5L6OVL7+oqGB1EPhPcDg== + dependencies: + "@verida/web3" "^2.1.3" + axios "^0.27.2" + ethers "^5.7.0" + +"@verida/verifiable-credentials@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/verifiable-credentials/-/verifiable-credentials-2.1.3.tgz#20a31c080332828084f3c6dbf90745bbcbc69f60" + integrity sha512-5DC75LxiIkks+D8bgbaho4YCDMW9vLSjbQ6tUqDp8pas8jH2IjKC5Kucbl8ZGZA/pPlzxZbBar5r/6mSeQ/a6A== + dependencies: + "@verida/encryption-utils" "^2.1.3" + "@verida/helpers" "^2.1.3" + "@verida/types" "^2.1.3" + "@verida/vda-did-resolver" "^2.1.3" + axios "^1.3.3" + dayjs "^1.10.7" + did-jwt "^6.11.0" + did-jwt-vc "^3.1.0" + lodash "^4.17.21" + tweetnacl-util "^0.15.1" + url "^0.11.0" + +"@verida/web3@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.1.3.tgz#4a021ab9adf5f9725635da27678b22649db2219c" + integrity sha512-n5dgAcZtYVhLBFMD5p0hmYjlGWfXfQmqjzt96prCgUF9q+CtwrwW+qgb7k8NScAoeC5jGpi0mNhvsOsDUQyW0Q== + dependencies: + axios "^1.2.3" ethers "^5.7.0" abbrev@1: @@ -1050,6 +1116,15 @@ axios@^1.2.3: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-runtime@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -1070,6 +1145,11 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1099,6 +1179,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bech32@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== + binary-case@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/binary-case/-/binary-case-1.1.4.tgz#d687104d59e38f2b9e658d3a58936963c59ab931" @@ -1199,6 +1284,13 @@ bs58@^4.0.1: dependencies: base-x "^3.0.2" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -1262,7 +1354,7 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -canonicalize@^1.0.5: +canonicalize@^1.0.5, canonicalize@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" integrity sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A== @@ -1521,6 +1613,11 @@ date-format@^4.0.10: resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.10.tgz#7aa4bc0ad0c79f4ba858290e5dbb47f27d602e79" integrity sha512-RuMIHocrVjF84bUSTcd1uokIsLsOsk1Awb7TexNOI3f48ukCu39mjslWquDTA08VaDMF2umr3MB9ow5EyJTWyA== +dayjs@^1.10.7: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + dayjs@^1.11.1: version "1.11.2" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.2.tgz#fa0f5223ef0d6724b3d8327134890cfe3d72fbe5" @@ -1606,6 +1703,14 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +did-jwt-vc@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-3.1.1.tgz#393ef7e880b14068b228ddfe54cae50aa3aadc97" + integrity sha512-1fuxCqQ73gQCMp7vY1/lYyp0T69GxQQ46CoYQQgSr73eCvw6wor4rqvixZsJ+uPU1LFDAmq6lvO1ExNbeRZJyw== + dependencies: + did-jwt "^6.11.0" + did-resolver "^4.0.0" + did-jwt@5.7.0: version "5.7.0" resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-5.7.0.tgz#7c5284daece5c86388db90e1274d0df63bb20f52" @@ -1622,6 +1727,24 @@ did-jwt@5.7.0: js-sha3 "^0.8.0" uint8arrays "^3.0.0" +did-jwt@^6.11.0: + version "6.11.1" + resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.11.1.tgz#7c75bfbf72d8ad317008087cec2127db929aafb5" + integrity sha512-PsUn2ajDN0TxE4DbIMy6iaa+B19WeoBGrct9rRV2OY2Amtfw/2oMihD8ra/y/cdbUtsA2gMjiB7DYiM4V4IVMg== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@stablelib/sha256" "^1.0.1" + "@stablelib/x25519" "^1.0.2" + "@stablelib/xchacha20poly1305" "^1.0.1" + bech32 "^2.0.0" + canonicalize "^1.0.8" + did-resolver "^4.0.0" + elliptic "^6.5.4" + js-sha3 "^0.8.0" + multiformats "^9.6.5" + uint8arrays "^3.0.0" + did-resolver@^3.1.0: version "3.2.2" resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-3.2.2.tgz#6f4e252a810f785d1b28a10265fad6dffee25158" @@ -1766,7 +1889,7 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -ethers@^5.5.1, ethers@^5.7.0, ethers@^5.7.2: +ethers@^5.5.1, ethers@^5.7.0: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2881,7 +3004,7 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiformats@^9.4.2: +multiformats@^9.4.2, multiformats@^9.6.5: version "9.9.0" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== @@ -3414,10 +3537,10 @@ readable-stream@1.1.14: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +"readable-stream@2 || 3", readable-stream@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -3436,6 +3559,15 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.3.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~0.0.2: version "0.0.4" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d" @@ -4064,6 +4196,14 @@ url@0.10.3: punycode "1.3.2" querystring "0.2.0" +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 8955b8ad35ba391e1c2f6177c41422ff30690111 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 2 Mar 2023 21:44:44 +1030 Subject: [PATCH 02/33] Support generating profiles as a VC. Refactor. --- src/config.ts | 16 +---- src/controller.ts | 90 ++++------------------------ src/providers/BaseProvider.ts | 57 +++++++++++++----- src/providers/facebook/index.ts | 4 ++ src/providers/twitter/index.ts | 4 ++ src/server.ts | 23 ++++++- src/serverconfig.json | 58 ++++++++++++------ src/utils.ts | 103 ++++++++++++++++++++++++++++++++ 8 files changed, 228 insertions(+), 127 deletions(-) create mode 100644 src/utils.ts diff --git a/src/config.ts b/src/config.ts index cfeac93b..f938f453 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,16 +1,2 @@ -import { EnvironmentType } from '@verida/client-ts' import serverconfig from './serverconfig.json' - -export default serverconfig - -export function strToEnvType(s: string) { - if (s == EnvironmentType.LOCAL) { - return EnvironmentType.LOCAL; - } else if (s == EnvironmentType.TESTNET) { - return EnvironmentType.TESTNET; - } else if (s == EnvironmentType.MAINNET) { - return EnvironmentType.MAINNET; - } else { - throw new Error("Invalid EnvironmentType value"); - } -} \ No newline at end of file +export default serverconfig \ No newline at end of file diff --git a/src/controller.ts b/src/controller.ts index d1651882..a876b805 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -1,18 +1,9 @@ import { Request, Response } from 'express' - -import { Client, ContextInterfaces } from '@verida/client-ts' -import { AutoAccount } from '@verida/account-node' +import { DatabasePermissionOptionsEnum } from '@verida/types' import EncryptionUtils from '@verida/encryption-utils' -import fs from 'fs' - import serverconfig from '../src/serverconfig.json' -import {strToEnvType} from "./config" -const VERIDA_ENVIRONMENT = strToEnvType(serverconfig.verida.environment) const CONTEXT_NAME = serverconfig.verida.contextName -const PRIVATE_KEY = serverconfig.verida.privateKey -const DEFAULT_ENDPOINTS = serverconfig.verida.defaultEndpoints -const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig const log4js = require("log4js") const logger = log4js.getLogger() @@ -23,6 +14,7 @@ const DATA_SYNC_REQUEST_SCHEMA = 'https://vault.schemas.verida.io/data-connectio import Providers from "./providers" import TokenExpiredError from './providers/TokenExpiredError' +import Utils from './utils' const delay = async (ms: number) => { await new Promise((resolve) => setTimeout(() => resolve(true), ms)) @@ -129,12 +121,11 @@ export default class Controller { * @returns */ public static async sync(req: Request, res: Response, next: any) { - const { account, context } = await Controller.getNetwork() + const { account, context } = await Utils.getNetwork() const serverDid = await account.did() const providerName = req.params.provider const provider = Providers(providerName) - provider.setSigner(account) const query = req.query const did = query.did.toString() @@ -144,8 +135,8 @@ export default class Controller { const syncRequestDatabaseName = EncryptionUtils.hash(`${did}-${DATA_SYNC_REQUEST_SCHEMA}`) const syncRequestDatastore = await context.openDatastore(DATA_SYNC_REQUEST_SCHEMA, { permissions: { - read: ContextInterfaces.PermissionOptionsEnum.USERS, - write: ContextInterfaces.PermissionOptionsEnum.USERS, + read: DatabasePermissionOptionsEnum.USERS, + write: DatabasePermissionOptionsEnum.USERS, readList: [did], writeList: [did] }, @@ -196,8 +187,6 @@ export default class Controller { return } - console.log('b') - // Add account auth info if it has changed const newAuth = provider.getAccountAuth() if (newAuth) { @@ -205,7 +194,7 @@ export default class Controller { } // Add latest profile info - syncRequest.syncInfo.profile = await provider.getProfile() + syncRequest.syncInfo.profile = await provider.getProfile(did, context) const response: any = {} const syncingDatabases = [] @@ -218,8 +207,8 @@ export default class Controller { // open a datastore where the user has permission to access the datastores const datastore = await context.openDatastore(schemaUri, { permissions: { - read: ContextInterfaces.PermissionOptionsEnum.USERS, - write: ContextInterfaces.PermissionOptionsEnum.USERS, + read: DatabasePermissionOptionsEnum.USERS, + write: DatabasePermissionOptionsEnum.USERS, readList: [did], writeList: [did] }, @@ -366,7 +355,7 @@ export default class Controller { const query = req.query const did: string = query.did.toString() - const { context } = await Controller.getNetwork() + const { context } = await Utils.getNetwork() const clearedDatabases = [] for (let i in schemaUris) { @@ -374,8 +363,8 @@ export default class Controller { const databaseName = EncryptionUtils.hash(`${did}-${schemaUri}`) const datastore = await context.openDatastore(schemaUri, { permissions: { - read: ContextInterfaces.PermissionOptionsEnum.USERS, - write: ContextInterfaces.PermissionOptionsEnum.USERS, + read: DatabasePermissionOptionsEnum.USERS, + write: DatabasePermissionOptionsEnum.USERS, readList: [did], writeList: [did] }, @@ -398,61 +387,4 @@ export default class Controller { }) } - /** - * Get a network, context and account instance - * - * @returns - */ - public static async getNetwork(): Promise { - const network = new Client({ - environment: VERIDA_ENVIRONMENT - }) - const account = new AutoAccount(DEFAULT_ENDPOINTS, { - privateKey: PRIVATE_KEY, - environment: VERIDA_ENVIRONMENT, - // @ts-ignore - didClientConfig: DID_CLIENT_CONFIG - }) - await network.connect(account) - const context = await network.openContext(CONTEXT_NAME) - - return { - network, - context, - account - } - } - - /** - * Get a list of all the supported providers - */ - public static async getProviders(): Promise { - // Build a list of data source providers from the providers directory - const providerDirectory = fs.readdirSync('./src/providers') - const providers = [] - for (let i in providerDirectory) { - const providerEntry = providerDirectory[i] - if (providerEntry.match('\\.')) { - // ignore files (indicated by having a `.` in the name) - continue - } - - providers.push(providerEntry) - } - - // Build up a list of providers - const providerList = [] - for (let p in providers) { - const providerName = providers[p] - const provider = Providers(providerName) - providerList.push({ - name: providerName, - label: provider.getLabel(), - icon: provider.icon ? provider.icon : `${serverconfig.assetsUrl}/${providerName}/icon.png` - }) - } - - return providerList - } - } \ No newline at end of file diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index 2da34176..d51fd2ba 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -1,5 +1,6 @@ -import { AutoAccount } from '@verida/account-node' +import { Context } from '@verida/client-ts' import { Request, Response } from 'express' +import Utils from '../utils' import BaseProviderConfig from './BaseProviderConfig' export interface AccountAuth { @@ -15,30 +16,32 @@ export interface AccountProfile { createdAt?: string url?: string avatarUrl?: string - proof?: string - proofSignature?: string + credential?: string } export default class BaseProvider { - protected signerContext: string - protected signerAccount?: AutoAccount + protected signerContext: Context protected icon?: string protected config: BaseProviderConfig protected newAuth?: AccountAuth protected profile?: AccountProfile - public constructor(config: BaseProviderConfig, signerContext: string) { + public constructor(config: BaseProviderConfig, signerContext: Context) { this.config = config this.signerContext = signerContext } - public setSigner(signerAccount: AutoAccount) { - this.signerAccount = signerAccount + public getProviderId(): string { + throw new Error('Not implemented') + } + + public getProviderImageUrl(): string { + return this.icon } - public getProviderId() { + public getProviderLabel(): string { throw new Error('Not implemented') } @@ -54,13 +57,37 @@ export default class BaseProvider { throw new Error('Not implemented') } - public async getProfile(): Promise { - if (this.profile && !this.profile.proof) { - const did = await this.signerAccount.did() - this.profile.proof = `${this.getProviderId()}-${this.profile.id}-${did.toLowerCase()}` + public async getProfileData(did: string): Promise> { + const profileLabel = this.profile.name || this.profile.username || this.profile.id + + const credentialData: Record = { + did, + name: `${this.getProviderLabel()}: ${profileLabel}`, + origin: this.getProviderId(), + type: 'account', + image: this.getProviderImageUrl(), + description: `Proof ${did} controls ${this.getProviderLabel()} account ${profileLabel}${profileLabel == this.profile.id ? '' : '(' + this.profile.id+ ')'}`, + attributes: { + accountCreated: this.profile.createdAt + }, + uniqueAttribute: this.profile.id, + } + + if (this.profile.url) { + credentialData.external_url = this.profile.url + } + + if (this.profile.avatarUrl) { + credentialData.attributes.avatarUrl = this.profile.avatarUrl + } + + return credentialData + } - const keyring = await this.signerAccount.keyring(this.signerContext) - this.profile.proofSignature = await keyring.sign(this.profile.proof) + public async getProfile(did: string): Promise { + if (this.profile && !this.profile.credential) { + const credentialData = await this.getProfileData(did) + this.profile.credential = await Utils.buildCredential(credentialData, this.signerContext) } return this.profile diff --git a/src/providers/facebook/index.ts b/src/providers/facebook/index.ts index 787f592d..b8ee30a1 100644 --- a/src/providers/facebook/index.ts +++ b/src/providers/facebook/index.ts @@ -26,6 +26,10 @@ export default class FacebookProvider extends Base { return 'facebook' } + public getProviderLabel() { + return 'Facebook' + } + public syncHandlers(): any[] { return [ Following, diff --git a/src/providers/twitter/index.ts b/src/providers/twitter/index.ts index 28ade64a..87ed78a2 100644 --- a/src/providers/twitter/index.ts +++ b/src/providers/twitter/index.ts @@ -29,6 +29,10 @@ export default class TwitterProvider extends Base { return 'twitter' } + public getProviderLabel() { + return 'Twitter' + } + public syncHandlers(): any[] { return [ Following, diff --git a/src/server.ts b/src/server.ts index a4365201..5ce30522 100644 --- a/src/server.ts +++ b/src/server.ts @@ -3,7 +3,28 @@ This lets us run the Express server locally */ const app = require('./server-app'); + const PORT = process.env.SERVER_PORT ? process.env.SERVER_PORT : 5021; + + app.listen(PORT, () => { console.log(`server running on port ${PORT}`); -}); \ No newline at end of file +}); +/* + +const https = require("https") +const fs = require("fs") + +const key = fs.readFileSync("./keys/server.key") +const cert = fs.readFileSync("./keys/server.cert") + +https.createServer( + { + key, + cert + }, + app + ).listen(PORT, () => { + console.log(`server running on port ${PORT}`) +}); +*/ \ No newline at end of file diff --git a/src/serverconfig.json b/src/serverconfig.json index d35447bc..8208a32c 100644 --- a/src/serverconfig.json +++ b/src/serverconfig.json @@ -1,55 +1,79 @@ { - "serverUrl": "http://localhost:5021", - "assetsUrl": "http://localhost:5021/assets", + "serverUrl": "http://192.168.68.124:5021", + "assetsUrl": "http://192.168.68.124:5021/assets", "logLevel": "debug", "verida": { "environment": "testnet", "contextName": "Verida: Data Connector", - "privateKey": "", + "privateKey": "0xccd3b996ec98a9a536efdffbae40e5eaaf117765a587483c69195c9460165c37", "defaultEndpoints": { "defaultDatabaseServer": { "type": "VeridaDatabase", - "endpointUri": [] + "endpointUri": ["https://node1-apse2.acacia.verida.tech/", "https://node1-use2.acacia.verida.tech/", "https://node3-apse2.acacia.verida.tech/"] }, "defaultMessageServer": { "type": "VeridaMessage", - "endpointUri": [] + "endpointUri": ["https://node1-apse2.acacia.verida.tech/", "https://node1-use2.acacia.verida.tech/", "https://node3-apse2.acacia.verida.tech/"] } }, "didClientConfig": { - "callType": "web3", + "callType": "gasless", "network": "testnet", "web3Config": { + "rpcUrl": "https://rpc-mumbai.maticvigil.com/", + "serverConfig": { + "headers": { + "context-name": "Verida: Vault" + } + }, + "postConfig": { + "headers": { + "user-agent": "Verida-Vault" + } + }, + "endpointUrl": "https://meta-tx-server1.tn.verida.tech" }, "rpcUrl": "https://rpc-mumbai.maticvigil.com/", - "didEndpoints": [] + "didEndpoints": ["https://node1-apse2.acacia.verida.tech/did/", "https://node1-use2.acacia.verida.tech/did/", "https://node3-apse2.acacia.verida.tech/did/"] } }, "testing": { - "contextName": "", - "veridaPrivateKey": "", - "encryptionKey": "" + "contextName": "Verida Testing: Fake Vault", + "veridaPrivateKey": "0x00d3b996ec98a9a536efecfbae40e5eaaf117765a587483c69195c9460165d37", + "encryptionKey": "aa8898c013c239012cec066f5cbb0165" }, "providers": { "facebook": { "label": "Facebook", - "appId": "", - "appSecret": "", + "appId": "1118636508992307", + "appSecret": "5a88987023c239012cec066f5c200175", "followingLimit": 20, "postLimit": 20, "testing": { - "accessToken": "" + "accessToken": "EAAP5ZANvAUzMBAPYqkvmGZCSk9WZBL2kMO34sTG2m0XXlLOEg83GZAvBvjDEZAKPOqYuMaE1OPXUTyDXHuBQ4zN01Vtdpp1jKA9z98JbZALSBMQKvssCL580n9QyWqOV8CTTOZCVqNVSr8wrZAr97mvfZAZAtGrL0W6vuiCi8coeN4rRIuTO33pJqK8Deo2rOpj1PgV5XXpjQU3aQJhabb5qw7pEeXjFlaHTJqreFa4K5eECIutyi3OLF8" + } + }, + "twitter-verida": { + "label": "Twitter", + "apiKey": "oPPIdjDTQMCerrUqpIbW8sEzl", + "apiSecret": "fGEXBRkn2ISp7TFBtJisSAeyo0WONzV8TxGzPMlAcC3SjZ8z5M", + "bearerToken": "AAAAAAAAAAAAAAAAAAAAAJeLdAEAAAAAnwbWfKEUlhJvxYNUk%2F2xoqNH0Vs%3DKGopJYVV59gWCOfm0CovUjLI9w7mAyxVxXtokpDwIBApfLboDR", + "followingLimit": 20, + "postLimit": 20, + "testing": { + "accessToken": "1196640912450834433-DmjuIJ6kHXNQaqpENJK0v1pWf1OajD", + "refreshToken": "ZNwoOzEjsLs92IIYSeGilKZ1mUFDM8XeSYuMMqF7TZ9gM" } }, "twitter": { "label": "Twitter", - "clientID": "", - "clientSecret": "", + "clientID": "RHAxQUZmLVVMbm9NN2puajluZmE6MTpjaQ", + "clientSecret": "G0oWBZkgxVG7KCy8_5r4eHvxh-tQ8GoLmQm4mvsJi4zxhlpvIr", "followingLimit": 20, "postLimit": 20, "testing": { - "accessToken": "", - "refreshToken": "" + "accessToken": "bUNON0JrQ2lRcHE5LUtnaElqX05yUUh6dHdpdzRlbkpDSGo0Nks3azBJeEtvOjE2NzQxMDU2MzMyNjI6MTowOmF0OjE", + "refreshToken": "X0g2ODZVLVNDYjU2NUtfZ1pFcUUyZ0xPMGtFNDlHTHNfNWpiNmZadUh3R1EyOjE2NzQxMDU2MzMyNjI6MTowOnJ0OjE" } } }, diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 00000000..11a9f7d3 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,103 @@ +import { EnvironmentType } from '@verida/types' +import { AutoAccount } from "@verida/account-node" +import { Client, Context } from "@verida/client-ts" +import { Credentials } from '@verida/verifiable-credentials' +import { AccountProfile } from './providers/BaseProvider'; +import Providers from "./providers" +import fs from 'fs' +import serverconfig from '../src/serverconfig.json' + +const CONTEXT_NAME = serverconfig.verida.contextName +const PRIVATE_KEY = serverconfig.verida.privateKey +const DEFAULT_ENDPOINTS = serverconfig.verida.defaultEndpoints +const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig + +const REPUTATION_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/social/credential/reputation/v0.1.0/schema.json' + +export default class Utils { + + /** + * Get a network, context and account instance + * + * @returns + */ + public static async getNetwork(): Promise { + const VERIDA_ENVIRONMENT = Utils.strToEnvType(serverconfig.verida.environment) + const network = new Client({ + environment: VERIDA_ENVIRONMENT + }) + const account = new AutoAccount(DEFAULT_ENDPOINTS, { + privateKey: PRIVATE_KEY, + environment: VERIDA_ENVIRONMENT, + // @ts-ignore + didClientConfig: DID_CLIENT_CONFIG + }) + await network.connect(account) + const context = await network.openContext(CONTEXT_NAME) + + return { + network, + context, + account + } + } + + /** + * Get a list of all the supported providers + */ + public static async getProviders(): Promise { + // Build a list of data source providers from the providers directory + const providerDirectory = fs.readdirSync('./src/providers') + const providers = [] + for (let i in providerDirectory) { + const providerEntry = providerDirectory[i] + if (providerEntry.match('\\.')) { + // ignore files (indicated by having a `.` in the name) + continue + } + + providers.push(providerEntry) + } + + // Build up a list of providers + const providerList = [] + for (let p in providers) { + const providerName = providers[p] + const provider = Providers(providerName) + providerList.push({ + name: providerName, + label: provider.getLabel(), + icon: provider.icon ? provider.icon : `${serverconfig.assetsUrl}/${providerName}/icon.png` + }) + } + + return providerList + } + + public static async buildCredential( + credentialData: Record, + context: Context, + ): Promise { + const credentials = new Credentials(); + + return await credentials.createVerifiableCredentialRecord({ + context: context as any, + data: credentialData, + subjectId: credentialData.did, + schema: REPUTATION_CREDENTIAL_SCHEMA + }, credentialData.name, credentialData.description, credentialData.image) + } + + public static strToEnvType(s: string) { + if (s == EnvironmentType.LOCAL) { + return EnvironmentType.LOCAL; + } else if (s == EnvironmentType.TESTNET) { + return EnvironmentType.TESTNET; + } else if (s == EnvironmentType.MAINNET) { + return EnvironmentType.MAINNET; + } else { + throw new Error("Invalid EnvironmentType value"); + } + } + +} \ No newline at end of file From 8b386825d0535bfd7ed975116cd40e969e1ce858 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 2 Mar 2023 22:00:37 +1030 Subject: [PATCH 03/33] Add (untested) SBT minting --- src/controller.ts | 2 +- src/providers/BaseProvider.ts | 2 +- src/request-validator.ts | 5 ++-- src/routes.ts | 3 +++ src/sbtController.ts | 47 +++++++++++++++++++++++++++++++++++ src/utils.ts | 16 +++++++++--- 6 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 src/sbtController.ts diff --git a/src/controller.ts b/src/controller.ts index a876b805..0cde4f65 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -14,7 +14,7 @@ const DATA_SYNC_REQUEST_SCHEMA = 'https://vault.schemas.verida.io/data-connectio import Providers from "./providers" import TokenExpiredError from './providers/TokenExpiredError' -import Utils from './utils' +import { Utils } from './utils' const delay = async (ms: number) => { await new Promise((resolve) => setTimeout(() => resolve(true), ms)) diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index d51fd2ba..8b82572d 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -1,6 +1,6 @@ import { Context } from '@verida/client-ts' import { Request, Response } from 'express' -import Utils from '../utils' +import { Utils } from '../utils' import BaseProviderConfig from './BaseProviderConfig' export interface AccountAuth { diff --git a/src/request-validator.ts b/src/request-validator.ts index 391983f9..3690e614 100644 --- a/src/request-validator.ts +++ b/src/request-validator.ts @@ -1,7 +1,6 @@ -const basicAuth = require('express-basic-auth') const mcache = require("memory-cache") import { DIDClient } from '@verida/did-client' -import { sign } from 'crypto' +import { VERIDA_ENVIRONMENT } from './utils' let didClient: DIDClient @@ -35,7 +34,7 @@ export default class RequestValidator { if (!didDocument) { if (!didClient) { didClient = new DIDClient({ - network: 'testnet' + network: VERIDA_ENVIRONMENT }) } diff --git a/src/routes.ts b/src/routes.ts index e79b6fed..e24443a8 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,5 +1,6 @@ import express from 'express' import Controller from './controller' +import SbtController from './sbtController' const router = express.Router() @@ -8,4 +9,6 @@ router.get('/callback/:provider', Controller.callback) router.get('/sync/:provider', Controller.sync) router.get('/syncDone/:provider', Controller.syncDone) +router.post('/mintSbt', SbtController.mintSbt) + export default router \ No newline at end of file diff --git a/src/sbtController.ts b/src/sbtController.ts new file mode 100644 index 00000000..e996af26 --- /dev/null +++ b/src/sbtController.ts @@ -0,0 +1,47 @@ +import { AutoAccount } from '@verida/account-node' +import { Request, Response } from 'express' +import { VeridaSBTClient, SBTClientConfig } from "@verida/vda-sbt-client" +import { Utils, PRIVATE_KEY, VERIDA_ENVIRONMENT, CONTEXT_NAME, DID_CLIENT_CONFIG } from './utils' +import { Credentials } from '@verida/verifiable-credentials' + +export default class SbtController { + + public static async mintSbt(req: Request, res: Response) { + // @ts-ignore + const { didJwtVc } = req.body + const credentials = new Credentials(); + try { + const sbtClient = await SbtController.getSbtClient() + const generatedCredential = await credentials.verifyCredential(didJwtVc, {}) + console.log(generatedCredential) + //sbtClient.claimSBT() + } catch (err: any) { + return res.status(500).send({ + status: "fail", + message: err.message + }) + } + } + + private static async getSbtClient(): Promise { + const networkInfo = await Utils.getNetwork() + const account = networkInfo.account + const keyring = await account.keyring(CONTEXT_NAME) + const keys = await keyring.getKeys() + const did = await account.did() + const didAddress = did.match(/(0x.*)/)[0] + + const config: SBTClientConfig = { + callType: 'web3', + identifier: didAddress, + signKey: keys.signPrivateKey, + chainNameOrId: VERIDA_ENVIRONMENT, + web3Options: DID_CLIENT_CONFIG.web3Config + } + + return new VeridaSBTClient(config) + } + + + +} \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts index 11a9f7d3..6afec1c3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -2,7 +2,6 @@ import { EnvironmentType } from '@verida/types' import { AutoAccount } from "@verida/account-node" import { Client, Context } from "@verida/client-ts" import { Credentials } from '@verida/verifiable-credentials' -import { AccountProfile } from './providers/BaseProvider'; import Providers from "./providers" import fs from 'fs' import serverconfig from '../src/serverconfig.json' @@ -14,7 +13,15 @@ const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig const REPUTATION_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/social/credential/reputation/v0.1.0/schema.json' -export default class Utils { +export { + CONTEXT_NAME, + PRIVATE_KEY, + DEFAULT_ENDPOINTS, + DID_CLIENT_CONFIG, + REPUTATION_CREDENTIAL_SCHEMA +} + +export class Utils { /** * Get a network, context and account instance @@ -99,5 +106,8 @@ export default class Utils { throw new Error("Invalid EnvironmentType value"); } } +} + +const VERIDA_ENVIRONMENT = Utils.strToEnvType(serverconfig.verida.environment) -} \ No newline at end of file +export { VERIDA_ENVIRONMENT } \ No newline at end of file From bc6f9951047423131ffbaddc5fc9d4dc4044817b Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Mar 2023 09:35:27 +1030 Subject: [PATCH 04/33] Remove console output --- src/request-validator.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/request-validator.ts b/src/request-validator.ts index 3690e614..632c92ce 100644 --- a/src/request-validator.ts +++ b/src/request-validator.ts @@ -16,13 +16,9 @@ export default class RequestValidator { * @param {*} req */ public authorize(did: string, signature: string, req: any, cb: any) { - console.log('authorize called') did = did.replace(/_/g, ":").toLowerCase() const storageContext = req.headers['context-name'] const cacheKey = `${did}/${storageContext}` - console.log("did", did) - console.log('signature', signature) - console.log('storageContext', storageContext) const authCheck = async () => { try { From b2ad72835f405c71d86c4dfe5620c561db565fe8 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Mar 2023 09:37:06 +1030 Subject: [PATCH 05/33] Start of SBT tests --- tests/vcsbt.tests.ts | 72 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/vcsbt.tests.ts diff --git a/tests/vcsbt.tests.ts b/tests/vcsbt.tests.ts new file mode 100644 index 00000000..1ef61980 --- /dev/null +++ b/tests/vcsbt.tests.ts @@ -0,0 +1,72 @@ +import Axios from 'axios' +const assert = require("assert") +import serverconfig from '../src/serverconfig.json' +import Providers from '../src/providers' +import CommonUtils from './common.utils' + +const SCHEMA_FOLLOWING = 'https://common.schemas.verida.io/social/following/v0.1.0/schema.json' + +const log4js = require("log4js") +const logger = log4js.getLogger() +logger.level = serverconfig.logLevel + +const providerName = 'twitter' +const providerConfig = serverconfig.providers[providerName] +const creds = providerConfig.testing + +let connection, followingDatastore, encryptionKey, credential + +// NEXT STEP: GET UPDATED TWITTER REFRESH AND ACCESS TOKEN + + +describe(`${providerName} Tests`, function() { + this.timeout(100000) + + describe("VC and SBT tests", () => { + //let syncResult + const provider = Providers(providerName) + + before(async () => { + const provider = Providers(providerName) + connection = await CommonUtils.getNetwork() + // Open the "following" datastore + followingDatastore = await connection.context.openDatastore( + SCHEMA_FOLLOWING + ) + + const info = await (await followingDatastore.getDb()).info() + encryptionKey = info.encryptionKey + await CommonUtils.closeDatastore(followingDatastore) + }) + + it('can sync without obtaining a VC', async() => { + // Todo: Make this use the server?? + const syncRequestResult = await CommonUtils.syncConnector(providerName, creds.accessToken, creds.refreshToken, connection.did, encryptionKey) + + console.log(syncRequestResult.data) + try { + const { serverDid, contextName, syncRequestId, syncRequestDatabaseName } = syncRequestResult.data + const syncData = await provider.sync(creds.accessToken, creds.refreshToken, SCHEMA_FOLLOWING) + console.log(syncData) + } catch (err) { + console.log(err) + } + }) + + it('can sync and obtain a VC', async() => { + + }) + + it('can generate a valid VC', async () => { + + }) + + it('can generate a valid SBT', async () => { + + }) + + after(async () => { + // Delete SBT? + }) + }) +}) \ No newline at end of file From 3c8bd34832f2438ac573868b0e1dbd10abe839c6 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Mar 2023 09:54:59 +1030 Subject: [PATCH 06/33] Update to superfaceai twitter lib --- package.json | 2 +- yarn.lock | 56 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 4543d8b7..038af56f 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ }, "homepage": "https://github.com/verida/server-template#readme", "dependencies": { + "@superfaceai/passport-twitter-oauth2": "^1.2.3", "@verida/account-node": "^2.0.0", "@verida/client-ts": "^2.0.1", "@verida/did-client": "^2.0.0", @@ -48,7 +49,6 @@ "nano": "^9.0.5", "passport": "^0.5.2", "passport-facebook": "^3.0.0", - "passport-twitter-oauth2.0": "^1.1.0", "ts-mocha": "^9.0.2", "twitter-api-v2": "^1.14.0" }, diff --git a/yarn.lock b/yarn.lock index 817be3d1..83ab71dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -500,6 +500,16 @@ "@stablelib/wipe" "^1.0.1" "@stablelib/xchacha20" "^1.0.1" +"@superfaceai/passport-twitter-oauth2@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@superfaceai/passport-twitter-oauth2/-/passport-twitter-oauth2-1.2.3.tgz#ca870e7b03552c5893800626e3f60995e56c0c96" + integrity sha512-kbGptW8AM7l6jJKlgCaoWSHVVNgNgCZCTPO9IDo7Wg8vQqOu+tQhRmJERAdbqcB3B/doG7Nd90nvFuLDH1sFLA== + dependencies: + passport-oauth2 "^1.6.1" + optionalDependencies: + "@types/passport" "1.x" + "@types/passport-oauth2" ">=1.4" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -586,6 +596,29 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.35.tgz#635b7586086d51fb40de0a2ec9d1014a5283ba4a" integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== +"@types/oauth@*": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@types/oauth/-/oauth-0.9.1.tgz#e17221e7f7936b0459ae7d006255dff61adca305" + integrity sha512-a1iY62/a3yhZ7qH7cNUsxoI3U/0Fe9+RnuFrpTKr+0WVOzbKlSLojShCKe20aOD1Sppv+i8Zlq0pLDuTJnwS4A== + dependencies: + "@types/node" "*" + +"@types/passport-oauth2@>=1.4": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.12.tgz#c2ae0ee3b16646188d8b0b6cdbc6880a0247dc5f" + integrity sha512-RZg6cYTyEGinrZn/7REYQds6zrTxoBorX1/fdaz5UHzkG8xdFE7QQxkJagCr2ETzGII58FAFDmnmbTUVMrltNA== + dependencies: + "@types/express" "*" + "@types/oauth" "*" + "@types/passport" "*" + +"@types/passport@*", "@types/passport@1.x": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.12.tgz#7dc8ab96a5e895ec13688d9e3a96920a7f42e73e" + integrity sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw== + dependencies: + "@types/express" "*" + "@types/pouchdb-core@*", "@types/pouchdb-core@^7.0.10": version "7.0.10" resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.10.tgz#d1ea1549e7fad6cb579f71459b1bc27252e06a5a" @@ -1075,7 +1108,7 @@ base64-js@^1.0.2, base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64url@3.x.x, base64url@^3.0.1: +base64url@3.x.x: version "3.0.1" resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== @@ -3047,7 +3080,7 @@ passport-facebook@^3.0.0: dependencies: passport-oauth2 "1.x.x" -passport-oauth2@1.x.x, passport-oauth2@^1.x.x: +passport-oauth2@1.x.x: version "1.6.1" resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.6.1.tgz#c5aee8f849ce8bd436c7f81d904a3cd1666f181b" integrity sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ== @@ -3058,19 +3091,22 @@ passport-oauth2@1.x.x, passport-oauth2@^1.x.x: uid2 "0.0.x" utils-merge "1.x.x" +passport-oauth2@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.7.0.tgz#5c4766c8531ac45ffe9ec2c09de9809e2c841fc4" + integrity sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ== + dependencies: + base64url "3.x.x" + oauth "0.9.x" + passport-strategy "1.x.x" + uid2 "0.0.x" + utils-merge "1.x.x" + passport-strategy@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= -passport-twitter-oauth2.0@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/passport-twitter-oauth2.0/-/passport-twitter-oauth2.0-1.1.0.tgz#22fcdbc98808ab15afef7be0061ac1be5ae9a9a4" - integrity sha512-woH8mM6l/62zSumuSYQ6Tr3lu4R2PPauIibVeLtxBzlRxI6djlCEYd5tY/FXJDAxcFe7RcTmrEFjC4iFTa8f7w== - dependencies: - base64url "^3.0.1" - passport-oauth2 "^1.x.x" - passport@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/passport/-/passport-0.5.3.tgz#e69b46c9bb3290660bc2b3299330d78710b198cc" From e9c37c023e07eede0f276ae286da9a3ca716fd22 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Mar 2023 09:58:07 +1030 Subject: [PATCH 07/33] Add missing packages --- package.json | 3 +++ yarn.lock | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 038af56f..77cc7742 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,9 @@ "@verida/client-ts": "^2.0.1", "@verida/did-client": "^2.0.0", "@verida/encryption-utils": "^2.0.0", + "@verida/types": "^2.1.3", + "@verida/vda-sbt-client": "^2.1.3", + "@verida/verifiable-credentials": "^2.1.3", "@verida/web3": "^2.0.0", "aws-serverless-express": "^3.4.0", "axios": "^1.2.3", diff --git a/yarn.lock b/yarn.lock index 8f0301a1..76b24799 100644 --- a/yarn.lock +++ b/yarn.lock @@ -670,7 +670,7 @@ binary-case "^1.0.0" type-is "^1.6.16" -"@verida/account-node@^2.1.3": +"@verida/account-node@^2.0.0", "@verida/account-node@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.1.3.tgz#4f4d10a1f9a5dbd9b4bfd19a2cbe191dbf1cc268" integrity sha512-/G3iHxNoP23l0iGjF5zMxgfkZSrkqnHjYuVbK+8EoKGnBIr4L4ibZIAi09plMoIZWSaFPpMjmJdddLDIYL3gtQ== @@ -697,7 +697,7 @@ lodash "^4.17.21" tweetnacl-util "^0.15.1" -"@verida/client-ts@^2.1.3": +"@verida/client-ts@^2.0.1": version "2.1.3" resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.1.3.tgz#7538083613829b1bcf6eedb5789640c77f342094" integrity sha512-7Vpg2Bef80NHr4CkD1RlApi6VAz2Bgig9IFDB8dlj1mlkWkTW5Ngzd7fIdDzsw/CB6Okhw5Aav2W8WXWKNsq/w== @@ -725,7 +725,7 @@ pouchdb-find "^7.2.2" uuid "^8.3.2" -"@verida/did-client@^2.1.3": +"@verida/did-client@^2.0.0", "@verida/did-client@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.1.3.tgz#cb5f9a1b99c2797d04578c585914fe57533efec2" integrity sha512-SfG3RfaGRvrFuFoGUzDq6BQUioiy3kjJ9wMSQrnErQCg+yJIshOnK1EWcrzsmKzUDiBRwp0kXj6/LpYQ9fP/6w== @@ -753,7 +753,7 @@ did-resolver "^4.0.1" lodash "^4.17.21" -"@verida/encryption-utils@^2.1.3": +"@verida/encryption-utils@^2.0.0", "@verida/encryption-utils@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.1.3.tgz#7e98ad6400d8e83875d5c8682b778e828c65ae15" integrity sha512-tFDxVNxIv1mFylm1CCeCNAT2F7hAKXcQeDJc0sJZqzzBZXeQMslAx9yVsD2Fh3tFstqc3E7ov2n3MjojlveuHQ== @@ -868,7 +868,7 @@ tweetnacl-util "^0.15.1" url "^0.11.0" -"@verida/web3@^2.1.3": +"@verida/web3@^2.0.0", "@verida/web3@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.1.3.tgz#4a021ab9adf5f9725635da27678b22649db2219c" integrity sha512-n5dgAcZtYVhLBFMD5p0hmYjlGWfXfQmqjzt96prCgUF9q+CtwrwW+qgb7k8NScAoeC5jGpi0mNhvsOsDUQyW0Q== From 68c83fabdef4f9244172ffedb117aa68c4f9eab6 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Mar 2023 10:41:28 +1030 Subject: [PATCH 08/33] Fix incorrect credential schema URL --- src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index 6afec1c3..af5a89cd 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -11,7 +11,7 @@ const PRIVATE_KEY = serverconfig.verida.privateKey const DEFAULT_ENDPOINTS = serverconfig.verida.defaultEndpoints const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig -const REPUTATION_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/social/credential/reputation/v0.1.0/schema.json' +const REPUTATION_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/social/credential/v0.1.0/schema.json' export { CONTEXT_NAME, From c398de60ee9dc9de4544f25e8cd9903f503455a7 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Mar 2023 10:41:56 +1030 Subject: [PATCH 09/33] Fix incorrect passing of Context object --- src/providers/BaseProvider.ts | 9 +++------ src/providers/index.ts | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index 8b82572d..96b2548c 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -21,16 +21,13 @@ export interface AccountProfile { export default class BaseProvider { - protected signerContext: Context - protected icon?: string protected config: BaseProviderConfig protected newAuth?: AccountAuth protected profile?: AccountProfile - public constructor(config: BaseProviderConfig, signerContext: Context) { + public constructor(config: BaseProviderConfig) { this.config = config - this.signerContext = signerContext } public getProviderId(): string { @@ -84,10 +81,10 @@ export default class BaseProvider { return credentialData } - public async getProfile(did: string): Promise { + public async getProfile(did: string, context: Context): Promise { if (this.profile && !this.profile.credential) { const credentialData = await this.getProfileData(did) - this.profile.credential = await Utils.buildCredential(credentialData, this.signerContext) + this.profile.credential = await Utils.buildCredential(credentialData, context) } return this.profile diff --git a/src/providers/index.ts b/src/providers/index.ts index f455670d..1ff98c63 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -8,5 +8,5 @@ export default function (providerName: string): any { const providerConfig = _.merge(CONFIG.providerDefaults, CONFIG.providers[providerName]) providerConfig.callbackUrl = `${CONFIG.serverUrl}/callback/${providerName}` - return new provider.default(providerConfig, CONFIG.verida.contextName) + return new provider.default(providerConfig) } \ No newline at end of file From e400ed8d873389e1bea80878fd9434129e7024ba Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 4 Mar 2023 11:31:46 +1030 Subject: [PATCH 10/33] Basic VC creation tests working --- src/providers/twitter/index.ts | 6 ++-- tests/common.utils.ts | 53 ++++++++++++++++++++++++++++------ tests/vcsbt.tests.ts | 25 +++++++--------- 3 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/providers/twitter/index.ts b/src/providers/twitter/index.ts index 87ed78a2..c76360a6 100644 --- a/src/providers/twitter/index.ts +++ b/src/providers/twitter/index.ts @@ -3,7 +3,7 @@ import Base from "../BaseProvider" import BaseProviderConfig from '../BaseProviderConfig' const passport = require("passport") -const TwitterStrategy = require("passport-twitter-oauth2.0") +import { Strategy as TwitterStrategy } from '@superfaceai/passport-twitter-oauth2' import { TwitterApi as TwitterClient } from 'twitter-api-v2' import dayjs from 'dayjs' @@ -145,10 +145,8 @@ export default class TwitterProvider extends Base { clientID: this.config.clientID, clientSecret: this.config.clientSecret, callbackURL: this.config.callbackUrl, - clientType: 'private', + clientType: 'confidential', scope: SCOPE, - pkce: true, // required, - state: true // required }, function(accessToken: string, refreshToken: string, profile: any, cb: any) { // Simply return the raw data diff --git a/tests/common.utils.ts b/tests/common.utils.ts index 5a28a0db..4622575f 100644 --- a/tests/common.utils.ts +++ b/tests/common.utils.ts @@ -1,11 +1,11 @@ - const assert = require("assert") import Axios from 'axios' -import { EnvironmentType, Context, Client, ContextInterfaces } from '@verida/client-ts' +import { Context, Client } from '@verida/client-ts' import { AutoAccount } from '@verida/account-node' import serverconfig from '../src/serverconfig.json' import Datastore from '@verida/client-ts/dist/context/datastore' +import { DatabasePermissionOptionsEnum, EnvironmentType } from '@verida/types' const SERVER_URL = serverconfig.serverUrl const TEST_VAULT_CONTEXT = serverconfig.testing.contextName @@ -14,6 +14,8 @@ const TEST_VAULT_PRIVATE_KEY = serverconfig.testing.veridaPrivateKey const VERIDA_ENVIRONMENT = serverconfig.verida.environment const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig +const DATA_SYNC_REQUEST_SCHEMA = 'https://vault.schemas.verida.io/data-connections/sync-request/v0.1.0/schema.json' + const axios = Axios.create() export default class CommonUtils { @@ -46,18 +48,16 @@ export default class CommonUtils { return await axios.get(`${SERVER_URL}/sync/${provider}?accessToken=${accessToken}&refreshToken=${refreshToken}&did=${did}&key=${encryptionKey}`) } - static openSchema = async (context: Context, contextName: string, schemaName: string, databaseName: string, encryptionKey: string, externalDid: string, did: string): Promise => { - const key = Buffer.from(encryptionKey, 'hex') - + static async openSchema(context: Context, contextName: string, schemaName: string, databaseName: string, encryptionKey: string, externalDid: string, did: string): Promise { const externalDatastore = await context.openExternalDatastore(schemaName, externalDid, { permissions: { - read: ContextInterfaces.PermissionOptionsEnum.USERS, - write: ContextInterfaces.PermissionOptionsEnum.USERS, + read: DatabasePermissionOptionsEnum.USERS, + write: DatabasePermissionOptionsEnum.USERS, readList: [did], writeList: [did] }, // @ts-ignore - encryptionKey: key, + encryptionKey: Buffer.from(encryptionKey, 'hex'), databaseName, contextName }) @@ -65,9 +65,44 @@ export default class CommonUtils { return externalDatastore } - static closeDatastore = async (datastore: Datastore): Promise => { + static getSyncResult = async (connection: any, syncRequestResult: any, encryptionKey: string) => { + const { serverDid, contextName, syncRequestId, syncRequestDatabaseName } = syncRequestResult.data + + let syncResult + let limit = 10 + while (limit > 0) { + try { + const syncRequest = await CommonUtils.openSchema( + connection.context, + contextName, + DATA_SYNC_REQUEST_SCHEMA, + syncRequestDatabaseName, + encryptionKey, + serverDid, + connection.did) + syncResult = await syncRequest.get(syncRequestId) + break + } catch (err) { + console.log(err.message) + limit-- + await CommonUtils.sleep(1000) + } + } + + if (!syncResult) { + throw new Error(`No sync result after 10 seconds`) + } else { + return syncResult + } + } + + static closeDatastore = async (datastore: Datastore) => { await datastore.close({ clearLocal: true }) } + + static sleep = async (ms) => { + return new Promise(resolve => setTimeout(resolve, ms)); + } } \ No newline at end of file diff --git a/tests/vcsbt.tests.ts b/tests/vcsbt.tests.ts index 1ef61980..982aee3c 100644 --- a/tests/vcsbt.tests.ts +++ b/tests/vcsbt.tests.ts @@ -3,6 +3,7 @@ const assert = require("assert") import serverconfig from '../src/serverconfig.json' import Providers from '../src/providers' import CommonUtils from './common.utils' +import { Credentials } from '@verida/verifiable-credentials' const SCHEMA_FOLLOWING = 'https://common.schemas.verida.io/social/following/v0.1.0/schema.json' @@ -16,9 +17,6 @@ const creds = providerConfig.testing let connection, followingDatastore, encryptionKey, credential -// NEXT STEP: GET UPDATED TWITTER REFRESH AND ACCESS TOKEN - - describe(`${providerName} Tests`, function() { this.timeout(100000) @@ -35,22 +33,21 @@ describe(`${providerName} Tests`, function() { ) const info = await (await followingDatastore.getDb()).info() - encryptionKey = info.encryptionKey + encryptionKey = Buffer.from(info.encryptionKey).toString('hex') await CommonUtils.closeDatastore(followingDatastore) }) it('can sync without obtaining a VC', async() => { - // Todo: Make this use the server?? const syncRequestResult = await CommonUtils.syncConnector(providerName, creds.accessToken, creds.refreshToken, connection.did, encryptionKey) - - console.log(syncRequestResult.data) - try { - const { serverDid, contextName, syncRequestId, syncRequestDatabaseName } = syncRequestResult.data - const syncData = await provider.sync(creds.accessToken, creds.refreshToken, SCHEMA_FOLLOWING) - console.log(syncData) - } catch (err) { - console.log(err) - } + const { source, status, syncInfo } = await CommonUtils.getSyncResult(connection, syncRequestResult, encryptionKey) + console.log(syncInfo) + console.log(syncInfo.profile.credential) + + const credentials = new Credentials() + const credentialData = syncInfo.profile.credential + const verifiedCredential = await credentials.verifyCredential(syncInfo.profile.credential.didJwtVc) + console.log('verifiedCredential') + console.log(verifiedCredential) }) it('can sync and obtain a VC', async() => { From d762baaf4eddba8eb6d93bd051888e608865639b Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 5 Mar 2023 21:56:26 +1030 Subject: [PATCH 11/33] Fix provider image. Generate VC that matches SBT credential schema. Add minting unit test. --- package.json | 1 + src/providers/BaseProvider.ts | 20 ++++--- src/sbtController.ts | 98 +++++++++++++++++++++++++++++++---- src/utils.ts | 10 ++-- tests/common.utils.ts | 7 +++ tests/vcsbt.tests.ts | 61 ++++++++++++++++------ 6 files changed, 164 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 77cc7742..a1d05f12 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@verida/client-ts": "^2.0.1", "@verida/did-client": "^2.0.0", "@verida/encryption-utils": "^2.0.0", + "@verida/helpers": "^2.1.3", "@verida/types": "^2.1.3", "@verida/vda-sbt-client": "^2.1.3", "@verida/verifiable-credentials": "^2.1.3", diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index 96b2548c..1148403e 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -1,7 +1,9 @@ import { Context } from '@verida/client-ts' +import { explodeDID } from '@verida/helpers' import { Request, Response } from 'express' import { Utils } from '../utils' import BaseProviderConfig from './BaseProviderConfig' +import serverconfig from '../serverconfig.json' export interface AccountAuth { accessToken: string, @@ -28,6 +30,7 @@ export default class BaseProvider { public constructor(config: BaseProviderConfig) { this.config = config + this.icon = `${serverconfig.assetsUrl}/${this.getProviderId()}/icon.png` } public getProviderId(): string { @@ -56,17 +59,19 @@ export default class BaseProvider { public async getProfileData(did: string): Promise> { const profileLabel = this.profile.name || this.profile.username || this.profile.id + const { address: didAddress } = explodeDID(did) const credentialData: Record = { did, + didAddress, name: `${this.getProviderLabel()}: ${profileLabel}`, - origin: this.getProviderId(), - type: 'account', + type: `${this.getProviderId()}-account`, image: this.getProviderImageUrl(), description: `Proof ${did} controls ${this.getProviderLabel()} account ${profileLabel}${profileLabel == this.profile.id ? '' : '(' + this.profile.id+ ')'}`, - attributes: { - accountCreated: this.profile.createdAt - }, + attributes: [{ + trait_type: "accountCreated", + value: this.profile.createdAt + }], uniqueAttribute: this.profile.id, } @@ -75,7 +80,10 @@ export default class BaseProvider { } if (this.profile.avatarUrl) { - credentialData.attributes.avatarUrl = this.profile.avatarUrl + credentialData.attributes.push({ + trait_type: "avatarUrl", + value: this.profile.avatarUrl + }) } return credentialData diff --git a/src/sbtController.ts b/src/sbtController.ts index e996af26..9f5b7c59 100644 --- a/src/sbtController.ts +++ b/src/sbtController.ts @@ -1,28 +1,108 @@ import { AutoAccount } from '@verida/account-node' import { Request, Response } from 'express' import { VeridaSBTClient, SBTClientConfig } from "@verida/vda-sbt-client" -import { Utils, PRIVATE_KEY, VERIDA_ENVIRONMENT, CONTEXT_NAME, DID_CLIENT_CONFIG } from './utils' +import { Utils, WHITELIST_SBT_ISSUERS, VERIDA_ENVIRONMENT, CONTEXT_NAME, DID_CLIENT_CONFIG } from './utils' import { Credentials } from '@verida/verifiable-credentials' +import { fetchVeridaUri, explodeVeridaUri, wrapUri } from '@verida/helpers' +import { Context } from '@verida/client-ts' +import { DIDClient } from '@verida/did-client' +import { Web3CallType } from '@verida/types' + +const SCHEMA_SBT_CREDENTIAL = 'https://common.schemas.verida.io/token/sbt/credential/v0.1.0/schema.json' export default class SbtController { public static async mintSbt(req: Request, res: Response) { + // verify issuer is this server's DID + // @ts-ignore - const { didJwtVc } = req.body - const credentials = new Credentials(); + const { credentialUri } = req.body + if (!credentialUri) { + return res.status(400).send({ + status: "fail", + message: `'credentialUri' is required` + }) + } + + const { mintAddress } = req.body + if (!mintAddress) { + return res.status(400).send({ + status: "fail", + message: `'mintAddress' is required` + }) + } + + // Fetch credential record from the network + const networkInfo = await Utils.getNetwork() + const context = networkInfo.context + const credentialRecord = await fetchVeridaUri(credentialUri, context) + + // Generate URL to mint that generates the metadata + const sbtUri = wrapUri(credentialUri) + + const credentials = new Credentials() try { + //const sbtClient = await SbtController.getSbtClient() + const generatedCredential = await credentials.verifyCredential(credentialRecord.didJwtVc, {}) + const sbtData = generatedCredential.verifiableCredential.credentialSubject + const proofs = generatedCredential.payload.vc.proofs + const vcIssuerDid = generatedCredential.payload.iss + + // Verify the DIDJWTVC is a valid SBT credential issued by a whitelisted DID + await SbtController.verifyDidJwtVc(generatedCredential, WHITELIST_SBT_ISSUERS, sbtData.did) + + // Get the context proof of the issuer + // (Links their DID to the signing key of the context that signed the credential proof) + const didClient = new DIDClient({ + network: VERIDA_ENVIRONMENT + }) + const issuerDidDoc = await didClient.get(vcIssuerDid) + const issuerContextProof = issuerDidDoc.locateContextProof(generatedCredential.payload.vc.veridaContextName) + + // Initiate a SBT claim on-chain const sbtClient = await SbtController.getSbtClient() - const generatedCredential = await credentials.verifyCredential(didJwtVc, {}) - console.log(generatedCredential) - //sbtClient.claimSBT() + + await sbtClient.claimSBT(sbtData.type, sbtData.uniqueAttribute, sbtUri, mintAddress, proofs['type-unique-didAddress'], issuerContextProof) + + return res.status(200).send({ + status: "success", + data: { + transactionId: '123' + } + }) } catch (err: any) { - return res.status(500).send({ + console.log(err) + return res.status(400).send({ status: "fail", message: err.message }) } } + private static async verifyDidJwtVc(generatedCredential: any, issuerDids: string[], subjectDid: string) { + // Verify credential signed by this issuer + const verifiableCredential = generatedCredential.verifiableCredential + + let issuerFound = false + issuerDids.forEach((issuerDid) => { + if (verifiableCredential.vc.issuer.toLowerCase() == issuerDid.toLowerCase()) { + issuerFound = true + } + }) + if (!issuerFound) { + throw new Error('Untrusted credential signer') + } + + // Verify subject DID is the one hosting the credential + if (verifiableCredential.vc.sub.toLowerCase() != subjectDid.toLowerCase()) { + throw new Error('Credential not published to the network by credential subject') + } + + if (verifiableCredential.credentialSchema.id != SCHEMA_SBT_CREDENTIAL) { + throw new Error('Invalid credential schema') + } + } + private static async getSbtClient(): Promise { const networkInfo = await Utils.getNetwork() const account = networkInfo.account @@ -32,9 +112,9 @@ export default class SbtController { const didAddress = did.match(/(0x.*)/)[0] const config: SBTClientConfig = { - callType: 'web3', + callType: DID_CLIENT_CONFIG.callType, identifier: didAddress, - signKey: keys.signPrivateKey, + signKey: `0x${Buffer.from(keys.signPrivateKey).toString('hex')}`, chainNameOrId: VERIDA_ENVIRONMENT, web3Options: DID_CLIENT_CONFIG.web3Config } diff --git a/src/utils.ts b/src/utils.ts index af5a89cd..660d7add 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -10,15 +10,19 @@ const CONTEXT_NAME = serverconfig.verida.contextName const PRIVATE_KEY = serverconfig.verida.privateKey const DEFAULT_ENDPOINTS = serverconfig.verida.defaultEndpoints const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig +const VERIDA_URI_WRAPPER = serverconfig.verida.veridaUriWrapper +const WHITELIST_SBT_ISSUERS = serverconfig.verida.whitelistSbtIssuers -const REPUTATION_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/social/credential/v0.1.0/schema.json' +const SBT_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/token/sbt/credential/v0.1.0/schema.json' export { CONTEXT_NAME, PRIVATE_KEY, DEFAULT_ENDPOINTS, DID_CLIENT_CONFIG, - REPUTATION_CREDENTIAL_SCHEMA + SBT_CREDENTIAL_SCHEMA, + VERIDA_URI_WRAPPER, + WHITELIST_SBT_ISSUERS } export class Utils { @@ -91,7 +95,7 @@ export class Utils { context: context as any, data: credentialData, subjectId: credentialData.did, - schema: REPUTATION_CREDENTIAL_SCHEMA + schema: SBT_CREDENTIAL_SCHEMA }, credentialData.name, credentialData.description, credentialData.image) } diff --git a/tests/common.utils.ts b/tests/common.utils.ts index 4622575f..766ae625 100644 --- a/tests/common.utils.ts +++ b/tests/common.utils.ts @@ -96,6 +96,13 @@ export default class CommonUtils { } } + static mintSBT = async(credentialUri: string, mintAddress: string): Promise => { + return await axios.post(`${SERVER_URL}/mintSbt`, { + credentialUri, + mintAddress + }) + } + static closeDatastore = async (datastore: Datastore) => { await datastore.close({ clearLocal: true diff --git a/tests/vcsbt.tests.ts b/tests/vcsbt.tests.ts index 982aee3c..aa679f8e 100644 --- a/tests/vcsbt.tests.ts +++ b/tests/vcsbt.tests.ts @@ -3,9 +3,13 @@ const assert = require("assert") import serverconfig from '../src/serverconfig.json' import Providers from '../src/providers' import CommonUtils from './common.utils' -import { Credentials } from '@verida/verifiable-credentials' +import { Credentials, SharingCredential } from '@verida/verifiable-credentials' +import { DatabasePermissionOptionsEnum } from '@verida/types' +import { buildVeridaUri, fetchVeridaUri } from '@verida/helpers' const SCHEMA_FOLLOWING = 'https://common.schemas.verida.io/social/following/v0.1.0/schema.json' +const SCHEMA_SBT = 'https://common.schemas.verida.io/token/sbt/storage/v0.1.0/schema.json' +const MINT_ADDRESS = '0x2cEf1aF8510C158008fD69Ef233Bfff732E5C30A' const log4js = require("log4js") const logger = log4js.getLogger() @@ -15,7 +19,12 @@ const providerName = 'twitter' const providerConfig = serverconfig.providers[providerName] const creds = providerConfig.testing -let connection, followingDatastore, encryptionKey, credential +let connection, followingDatastore, encryptionKey, credentialRecord + +// NEXT steps: +// 1. Make VC creation optional +// 2. Cant Mint SBT +// 3. Test if new Twitter passport has fixed issue on my phone describe(`${providerName} Tests`, function() { this.timeout(100000) @@ -37,30 +46,52 @@ describe(`${providerName} Tests`, function() { await CommonUtils.closeDatastore(followingDatastore) }) - it('can sync without obtaining a VC', async() => { + it('can sync and obtain a VC', async() => { const syncRequestResult = await CommonUtils.syncConnector(providerName, creds.accessToken, creds.refreshToken, connection.did, encryptionKey) const { source, status, syncInfo } = await CommonUtils.getSyncResult(connection, syncRequestResult, encryptionKey) - console.log(syncInfo) - console.log(syncInfo.profile.credential) + + assert.ok(status != 'error', `Sync error: ${syncInfo.error}`) const credentials = new Credentials() - const credentialData = syncInfo.profile.credential - const verifiedCredential = await credentials.verifyCredential(syncInfo.profile.credential.didJwtVc) - console.log('verifiedCredential') - console.log(verifiedCredential) - }) + credentialRecord = syncInfo.profile.credential + const verifiedCredential = await credentials.verifyCredential(credentialRecord.didJwtVc) + assert.ok(verifiedCredential, 'Have a verified credential') - it('can sync and obtain a VC', async() => { + console.log(verifiedCredential) + //assert.equal(verifiedCredential.payload.iss, connection.did, 'Correct DID') }) - it('can generate a valid VC', async () => { - + it('can generate a valid SBT', async () => { + // Save the credentialRecord to public credential db + const datastore = await connection.context.openDatastore(SCHEMA_SBT, { + permissions: { + read: DatabasePermissionOptionsEnum.PUBLIC, + write: DatabasePermissionOptionsEnum.OWNER + } + }); + + const sbtData = { + ...credentialRecord.credentialData, + didJwtVc: credentialRecord.didJwtVc + } + + const result = await datastore.save(sbtData) + console.log(result) + assert.ok(result, 'Saved credential record') + + const db = await datastore.getDb() + const info = await db.info() + const uri = buildVeridaUri(connection.did, connection.context.getContextName(), info.databaseName, result.id, {}) + console.log(uri) + await CommonUtils.mintSBT(uri, MINT_ADDRESS) + + // close database }) - it('can generate a valid SBT', async () => { + // try to mint the same SBT again which will fail - }) + // revoke SBT after(async () => { // Delete SBT? From 81268086490900d1295c5a411a63675198f0695e Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 13 Mar 2023 19:28:39 +1030 Subject: [PATCH 12/33] Update to latest protocol --- package.json | 18 ++-- yarn.lock | 246 ++++++++++++++++++++++++++------------------------- 2 files changed, 133 insertions(+), 131 deletions(-) diff --git a/package.json b/package.json index a1d05f12..e58357be 100644 --- a/package.json +++ b/package.json @@ -27,15 +27,15 @@ "homepage": "https://github.com/verida/server-template#readme", "dependencies": { "@superfaceai/passport-twitter-oauth2": "^1.2.3", - "@verida/account-node": "^2.0.0", - "@verida/client-ts": "^2.0.1", - "@verida/did-client": "^2.0.0", - "@verida/encryption-utils": "^2.0.0", - "@verida/helpers": "^2.1.3", - "@verida/types": "^2.1.3", - "@verida/vda-sbt-client": "^2.1.3", - "@verida/verifiable-credentials": "^2.1.3", - "@verida/web3": "^2.0.0", + "@verida/account-node": "^2.2.0", + "@verida/client-ts": "^2.2.0", + "@verida/did-client": "^2.2.0", + "@verida/encryption-utils": "^2.2.0", + "@verida/helpers": "^2.2.0", + "@verida/types": "^2.2.0", + "@verida/vda-sbt-client": "^2.2.0", + "@verida/verifiable-credentials": "^2.2.0", + "@verida/web3": "^2.2.0", "aws-serverless-express": "^3.4.0", "axios": "^1.2.3", "body-parser": "^1.19.0", diff --git a/yarn.lock b/yarn.lock index 76b24799..172f57b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -670,47 +670,47 @@ binary-case "^1.0.0" type-is "^1.6.16" -"@verida/account-node@^2.0.0", "@verida/account-node@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.1.3.tgz#4f4d10a1f9a5dbd9b4bfd19a2cbe191dbf1cc268" - integrity sha512-/G3iHxNoP23l0iGjF5zMxgfkZSrkqnHjYuVbK+8EoKGnBIr4L4ibZIAi09plMoIZWSaFPpMjmJdddLDIYL3gtQ== - dependencies: - "@verida/account" "^2.1.3" - "@verida/did-client" "^2.1.3" - "@verida/did-document" "^2.1.3" - "@verida/encryption-utils" "^2.1.3" - "@verida/keyring" "^2.1.3" - "@verida/types" "^2.1.3" +"@verida/account-node@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.2.0.tgz#8df17f61c5baebe3e7fde7c26f34e0c8c551cda0" + integrity sha512-e26lbV4izNxkN5FVVAIpo9UOVFtWjDLh/vpW7FyQHxBNGKmCgizI9FZkKHgCZNbqJgzy+k7WClGSLfyWhfiogA== + dependencies: + "@verida/account" "^2.2.0" + "@verida/did-client" "^2.2.0" + "@verida/did-document" "^2.2.0" + "@verida/encryption-utils" "^2.2.0" + "@verida/keyring" "^2.2.0" + "@verida/types" "^2.2.0" axios "^0.27.2" did-resolver "^4.0.1" -"@verida/account@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.1.3.tgz#a533915e208b44210470e9062580d5589a6566ed" - integrity sha512-6/wlhrNq88ckyn8W8gI815zRvpG8PJvmct4yZQZg3KBVV7c2uUy+bM/CXqRCN49wixquXJAYRtSt6hyVImhydQ== +"@verida/account@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.2.0.tgz#4c647d7ee20b199a2d239a21e373f0dde62a3620" + integrity sha512-UHxrpRPg4KIqLerrIgGuDMVCf7Mrk++YXYSMyvA0Oh0o1C1mx19AO7jgkSg3Vb4nV7iBnWL39PsiV07U6q1hzw== dependencies: - "@verida/keyring" "^2.1.3" - "@verida/storage-link" "^2.1.3" - "@verida/types" "^2.1.3" + "@verida/keyring" "^2.2.0" + "@verida/storage-link" "^2.2.0" + "@verida/types" "^2.2.0" did-jwt "^6.11.0" did-resolver "^4.0.1" lodash "^4.17.21" tweetnacl-util "^0.15.1" -"@verida/client-ts@^2.0.1": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.1.3.tgz#7538083613829b1bcf6eedb5789640c77f342094" - integrity sha512-7Vpg2Bef80NHr4CkD1RlApi6VAz2Bgig9IFDB8dlj1mlkWkTW5Ngzd7fIdDzsw/CB6Okhw5Aav2W8WXWKNsq/w== - dependencies: - "@verida/account" "^2.1.3" - "@verida/account-node" "^2.1.3" - "@verida/did-client" "^2.1.3" - "@verida/did-document" "^2.1.3" - "@verida/encryption-utils" "^2.1.3" - "@verida/keyring" "^2.1.3" - "@verida/storage-link" "^2.1.3" - "@verida/types" "^2.1.3" - "@verida/vda-name-client" "^2.1.3" +"@verida/client-ts@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.2.0.tgz#cb11f24e85f2d7864029922e18854f8c98fbf463" + integrity sha512-Ue9fuKJQh05fnVQ0ibX91RYNj8Pi9ZXLct5dVYO2uSYDSFn0en86ARgx7Ou+O8GNPrGZCJelDWNf2sEWSf11RQ== + dependencies: + "@verida/account" "^2.2.0" + "@verida/account-node" "^2.2.0" + "@verida/did-client" "^2.2.0" + "@verida/did-document" "^2.2.0" + "@verida/encryption-utils" "^2.2.0" + "@verida/keyring" "^2.2.0" + "@verida/storage-link" "^2.2.0" + "@verida/types" "^2.2.0" + "@verida/vda-name-client" "^2.2.0" ajv "^8.6.3" ajv-formats "^2.1.1" axios "^0.21.2" @@ -725,81 +725,81 @@ pouchdb-find "^7.2.2" uuid "^8.3.2" -"@verida/did-client@^2.0.0", "@verida/did-client@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.1.3.tgz#cb5f9a1b99c2797d04578c585914fe57533efec2" - integrity sha512-SfG3RfaGRvrFuFoGUzDq6BQUioiy3kjJ9wMSQrnErQCg+yJIshOnK1EWcrzsmKzUDiBRwp0kXj6/LpYQ9fP/6w== +"@verida/did-client@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.2.0.tgz#9d9c97a5035d48ba4de82b31f9b4d93daeeda653" + integrity sha512-peTjsisIbOmhhQN1s11hTUn5DLSQp/VEcUUfKx5YVmjraI2stwViS3QQ/EIdrUR3BPssmsGGA1PIEHQlWdOMJA== dependencies: - "@verida/did-document" "^2.1.3" - "@verida/types" "^2.1.3" - "@verida/vda-did-resolver" "^2.1.3" - "@verida/web3" "^2.1.3" + "@verida/did-document" "^2.2.0" + "@verida/types" "^2.2.0" + "@verida/vda-did-resolver" "^2.2.0" + "@verida/web3" "^2.2.0" axios "^0.23.0" deepcopy "^2.1.0" did-resolver "^4.0.1" ethers "^5.5.1" -"@verida/did-document@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.1.3.tgz#86dd9458f90e7d644fbb66d64f24885b730996d8" - integrity sha512-BZiTEey/f6U5WQ0iLXcolza9gye9A+A5oSO75xf2q0o7bPaIzC58X7jKsZQr/WbmTnwKQQqGdLaaPxy4LXEUAA== +"@verida/did-document@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.2.0.tgz#1c1337b89d0591961898013e8c974ac5e7aa4559" + integrity sha512-SO4gWj2dGSw37+QcrbHZp2GA7gJGT5SVhZWIoZ5CxqhUkftuMqzTmoSgixwqYdei6blmUfCFESx/PPZNZAfs4Q== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" "@ethersproject/transactions" "^5.7.0" - "@verida/encryption-utils" "^2.1.3" - "@verida/keyring" "^2.1.3" - "@verida/types" "^2.1.3" + "@verida/encryption-utils" "^2.2.0" + "@verida/keyring" "^2.2.0" + "@verida/types" "^2.2.0" did-resolver "^4.0.1" lodash "^4.17.21" -"@verida/encryption-utils@^2.0.0", "@verida/encryption-utils@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.1.3.tgz#7e98ad6400d8e83875d5c8682b778e828c65ae15" - integrity sha512-tFDxVNxIv1mFylm1CCeCNAT2F7hAKXcQeDJc0sJZqzzBZXeQMslAx9yVsD2Fh3tFstqc3E7ov2n3MjojlveuHQ== +"@verida/encryption-utils@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.2.0.tgz#cee371d205638eca4852deaddf805be9a19005a3" + integrity sha512-0OTeauQ46sOqcuFoM73dY29T7/i/ZP6vSFryG8Vcli6unAHmpJCnzoNse490iLHaZcKySdOG1mRnBhqw8rUpnw== dependencies: ethers "^5.5.1" json.sortify "^2.2.2" tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@verida/helpers@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.1.3.tgz#98865af4c1f267ec235e74b527e933fc32ac275d" - integrity sha512-sTeFm3PI4eUReNFKz1OksBHR1WAYnZBSHP9fcFz7PNhGNz5t+Dg4oAeb7qdqy+p6ghwAerREF5sGMfATHQN4Uw== +"@verida/helpers@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.2.0.tgz#1de0e0b79dbaa59ed3623535192de456e9f1308a" + integrity sha512-xyHJYsPeNpvUaiJjyz3RK1WyG9BsMpa3m9rZkwHh4BWyWn20358QAWl36Y5EDjQzHeZVgDM3f/ejePfnqbWbAw== dependencies: - "@verida/encryption-utils" "^2.1.3" - "@verida/types" "^2.1.3" + "@verida/encryption-utils" "^2.2.0" + "@verida/types" "^2.2.0" bs58 "^5.0.0" url "^0.11.0" -"@verida/keyring@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.1.3.tgz#08bb0b6a253b4d034cc3f5ce20f6e5c65811682a" - integrity sha512-aqWBud5zU92NSSipZTG8b/sh/s6NKU+8vVJfyPvXI38Pzu8BNXgFo/oA6QUkjqVhKjwRh5PhZJ53RtjVv+Tt7A== +"@verida/keyring@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.2.0.tgz#c7f7ace4b47ec8bceb626210b2f38d20b4f1e360" + integrity sha512-fF1p3WtgA3B4HYDOqVdO/WtzATx+54kBU7YP7+jUY+DY4XRRgNX/h5FpIfefey4kMulEZzgj75ZryfppQAUK/w== dependencies: - "@verida/encryption-utils" "^2.1.3" - "@verida/types" "^2.1.3" + "@verida/encryption-utils" "^2.2.0" + "@verida/types" "^2.2.0" ethers "^5.5.1" tweetnacl "^1.0.3" uuid "^8.3.2" -"@verida/storage-link@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.1.3.tgz#a8894c305746fefc3dd223eed125dc788bfdbee5" - integrity sha512-3Z72+h2MP0x0puDwBD01eGazvkfkZH1/i09E1QrLMKWPtjP7ecifiTlrMlZ+zl369OWG/60nCaavNEImfHWrzg== +"@verida/storage-link@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.2.0.tgz#8d06cba75f0a748fd21ed46afde544ebf1f2bf70" + integrity sha512-CXoYnx2l6kl4PWDUEIkxIJ0uoGJvygYYNFLJqXhWamuckG8oxympYyDZA1hhusMersgaDwTUNgt3NnpNJnLimg== dependencies: - "@verida/did-client" "^2.1.3" - "@verida/did-document" "^2.1.3" - "@verida/encryption-utils" "^2.1.3" - "@verida/keyring" "^2.1.3" + "@verida/did-client" "^2.2.0" + "@verida/did-document" "^2.2.0" + "@verida/encryption-utils" "^2.2.0" + "@verida/keyring" "^2.2.0" did-resolver "^4.0.0" url-parse "^1.5.3" -"@verida/types@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/types/-/types-2.1.3.tgz#494e40ae4de4e211387b6e53f3d2fc9bf5626c23" - integrity sha512-wjetw7ssUPVn9G8xpuYe8yhLlISGBtl+BPom9x68sgIOCTClf9KbwlruiXr7fc8rwv5ro87X5LreI+GWChVgMA== +"@verida/types@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/types/-/types-2.2.0.tgz#e5a3ba70b775350cebe061fb92e7be1ced5a67f5" + integrity sha512-IsnUkXaXosXJwGkFih9CrsbM3O5v8Ma3ik2DV3shz7FARt6RhyXtRsWfffqWShQWiAJ1EzdvmtLKFfc7/bmFtA== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -807,59 +807,61 @@ did-resolver "^4.0.1" tweetnacl "^1.0.3" -"@verida/vda-did-resolver@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.1.3.tgz#6ca9c854642793a015cb1894630011b452c56eba" - integrity sha512-X2pXREKbX4ygTSzYJ7tU6lgYbWbJ/YMCu9GdZF0gSkhRU9nt4ibpSozZlmRTUwoECz7+V9YYP1n8nxvc2yBfnw== +"@verida/vda-did-resolver@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.2.0.tgz#d54ef234e4fdfb877409ffd27a833c1d9cb30ac7" + integrity sha512-IzFy1zl8QYshs+aZLTR/OXgyD2mqCdqt1ydEUvCsyi3yx/hNVoWXnyEAPdKZwZTtQRLsh5oidUwl73t83/37vg== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/did-document" "^2.1.3" - "@verida/encryption-utils" "^2.1.3" - "@verida/types" "^2.1.3" - "@verida/vda-did" "^2.1.3" + "@verida/did-document" "^2.2.0" + "@verida/encryption-utils" "^2.2.0" + "@verida/types" "^2.2.0" + "@verida/vda-did" "^2.2.0" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/vda-did@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.1.3.tgz#beae18b2469194a6f1db893f596c2d7295557688" - integrity sha512-G5tqkMORo3poVdwG+PT2Evx1A0uI5BqqEDdRQg8ChtvqIlT1Z+vNs7ZuD1ptbEzjlBOiVGQAz4b2TmoqF0n93Q== +"@verida/vda-did@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.2.0.tgz#0dd7e47d1bca6bae9d458c1144280c3d7cc19ce4" + integrity sha512-ESZceZeVpwx0+L9cxeRhBApRoM3k2sB43MBNGZjvjTP0YtinwA+85r1rPnP7ZKsmpuc340YLIsPA/tpDfsxhWQ== dependencies: - "@verida/did-document" "^2.1.3" - "@verida/encryption-utils" "^2.1.3" - "@verida/types" "^2.1.3" - "@verida/web3" "^2.1.3" + "@verida/did-document" "^2.2.0" + "@verida/encryption-utils" "^2.2.0" + "@verida/types" "^2.2.0" + "@verida/web3" "^2.2.0" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/vda-name-client@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-2.1.3.tgz#d1c3bafac9af1e05072729ac4d905c0020b35c53" - integrity sha512-X2N6iYqPc3YnXEN2WDWVKRoXz0Y1Zpafj8oC+C/O4XGo+JjqZS9YDDwKxGk0aOJsuFDDVyHugsP2sjR52DSxYg== +"@verida/vda-name-client@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-2.2.0.tgz#5786b06f6ab97fec2c6c43c8e12a185b0d103262" + integrity sha512-AMD9QCV3FJ9zfMy3iNzB0xSuhYGiU/vAutfisMzn8PFWJGNODfn4+Xc+77F8J/xCmasBQjKtvbgJaB3qPb+ryQ== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/web3" "^2.1.3" + "@verida/helpers" "^2.2.0" + "@verida/types" "^2.2.0" + "@verida/web3" "^2.2.0" axios "^0.27.2" ethers "^5.7.0" -"@verida/vda-sbt-client@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/vda-sbt-client/-/vda-sbt-client-2.1.3.tgz#de5507d3bfad229acf2719029d4097a173463760" - integrity sha512-PqSe/kuzl3cnY7DsqlK2Md0htexeJm/Pd+KyTGxFAMh3HQIW3PM9d0+HKucihzGJ/c5L6OVL7+oqGB1EPhPcDg== +"@verida/vda-sbt-client@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/vda-sbt-client/-/vda-sbt-client-2.2.0.tgz#4b675393e0d197c3c9c3abe01065fe3c41f9218e" + integrity sha512-B7GuxQQbUlzaYV/JJtb1qvykSlKezH1f+URBTb9dh51vv2PHvFNxMhbDzqo1ByPtWwjDvxdq+Wezy7tBqOyLrw== dependencies: - "@verida/web3" "^2.1.3" + "@verida/web3" "^2.2.0" axios "^0.27.2" ethers "^5.7.0" -"@verida/verifiable-credentials@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/verifiable-credentials/-/verifiable-credentials-2.1.3.tgz#20a31c080332828084f3c6dbf90745bbcbc69f60" - integrity sha512-5DC75LxiIkks+D8bgbaho4YCDMW9vLSjbQ6tUqDp8pas8jH2IjKC5Kucbl8ZGZA/pPlzxZbBar5r/6mSeQ/a6A== +"@verida/verifiable-credentials@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/verifiable-credentials/-/verifiable-credentials-2.2.0.tgz#abd842f2968ca72678e17ec666d9b880905ad6ae" + integrity sha512-UBEKIHba1YkdFDqCBqt+WlKMCdxgu0eWRa7aSUW9zl6CsjhIiOZ+JN1ZYG7w8tMaQEDtiK8Z03xE8UM+apr9tA== dependencies: - "@verida/encryption-utils" "^2.1.3" - "@verida/helpers" "^2.1.3" - "@verida/types" "^2.1.3" - "@verida/vda-did-resolver" "^2.1.3" + "@verida/encryption-utils" "^2.2.0" + "@verida/helpers" "^2.2.0" + "@verida/types" "^2.2.0" + "@verida/vda-did-resolver" "^2.2.0" axios "^1.3.3" dayjs "^1.10.7" did-jwt "^6.11.0" @@ -868,10 +870,10 @@ tweetnacl-util "^0.15.1" url "^0.11.0" -"@verida/web3@^2.0.0", "@verida/web3@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.1.3.tgz#4a021ab9adf5f9725635da27678b22649db2219c" - integrity sha512-n5dgAcZtYVhLBFMD5p0hmYjlGWfXfQmqjzt96prCgUF9q+CtwrwW+qgb7k8NScAoeC5jGpi0mNhvsOsDUQyW0Q== +"@verida/web3@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.2.0.tgz#a3b22893467df2b8afd351dfb4d8b466346f2c2c" + integrity sha512-9jRHEWJMJfpN82svRJAb4SUQx9JgFJwt5GENnzM2EJThGTnTzLB4iwlvu+9pv81IP3+kx5UlDKf986Af0Z6vTg== dependencies: axios "^1.2.3" ethers "^5.7.0" @@ -1761,9 +1763,9 @@ did-jwt@5.7.0: uint8arrays "^3.0.0" did-jwt@^6.11.0: - version "6.11.1" - resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.11.1.tgz#7c75bfbf72d8ad317008087cec2127db929aafb5" - integrity sha512-PsUn2ajDN0TxE4DbIMy6iaa+B19WeoBGrct9rRV2OY2Amtfw/2oMihD8ra/y/cdbUtsA2gMjiB7DYiM4V4IVMg== + version "6.11.2" + resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.11.2.tgz#64d5f2cd32370946caef389e1e58408225b0f4c1" + integrity sha512-7YZEY2Jh1bnPdFunvVT5EETuGMbCSEw7PMoNqpeKVtVVk02rTjU/xvIfnBdqnhEHSb7OGu6kb7crtM6kpOGb1A== dependencies: "@stablelib/ed25519" "^1.0.2" "@stablelib/random" "^1.0.1" @@ -1784,9 +1786,9 @@ did-resolver@^3.1.0: integrity sha512-Eeo2F524VM5N3W4GwglZrnul2y6TLTwMQP3In62JdG34NZoqihYyOZLk+5wUW8sSgvIYIcJM8Dlt3xsdKZZ3tg== did-resolver@^4.0.0, did-resolver@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-4.0.1.tgz#11bb3f19ed1c8f53f4af4702912fa9f7852fc305" - integrity sha512-eHs2VLKhcANmh08S87PKvOauIAmSOd7nb7AlhNxcvOyDAIGQY1UfbiqI1VOW5IDKvOO6aEWY+5edOt1qrCp1Eg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-4.1.0.tgz#740852083c4fd5bf9729d528eca5d105aff45eb6" + integrity sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA== diff@5.0.0: version "5.0.0" @@ -3574,9 +3576,9 @@ readable-stream@1.1.14: string_decoder "~0.10.x" "readable-stream@2 || 3", readable-stream@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" - integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" From f1a0e4c19fe1c151697329121aa74054bf40c1e1 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 13 Mar 2023 19:30:48 +1030 Subject: [PATCH 13/33] Support per schema sync request config. Support sync done to delete user databases. --- src/controller.ts | 56 +++++++++++++++++++++++--------- src/providers/BaseProvider.ts | 52 +++++++++++++++-------------- src/providers/BaseSyncHandler.ts | 4 +-- src/routes.ts | 1 + tests/common.utils.ts | 25 ++++++++++++-- tests/server.tests.ts | 48 ++++++++++++++++++--------- 6 files changed, 125 insertions(+), 61 deletions(-) diff --git a/src/controller.ts b/src/controller.ts index 0cde4f65..dfc14383 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -103,7 +103,43 @@ export default class Controller { } /** - * Synchronize data from a third party data source with a local collection of datatores. + * Deprecated + * + * @param req + * @param res + * @param next + */ + public static async sync(req: Request, res: Response, next: any) { + const providerName = req.params.provider + const query = req.query + const did = query.did.toString() + const encryptionKey = Buffer.from(query.key.toString(), 'hex') + const accessToken = query.accessToken ? query.accessToken.toString() : '' + const refreshToken = query.refreshToken ? query.refreshToken.toString() : '' + + return Controller._sync(providerName, did, encryptionKey, accessToken, refreshToken, res, {}) + } + + /** + * New way... supports `syncSchemas` via POST body + * @param req + * @param res + * @param next + * @returns + */ + public static async syncStart(req: Request, res: Response, next: any) { + const providerName = req.params.provider + const encryptionKey = Buffer.from(req.body.key, 'hex') + const did = req.body.did + const accessToken = req.body.accessToken ? req.body.accessToken.toString() : '' + const refreshToken = req.body.refreshToken ? req.body.refreshToken.toString() : '' + const syncSchemas = req.body.syncSchemas + + return Controller._sync(providerName, did, encryptionKey, accessToken, refreshToken, res, syncSchemas) + } + + /** + * Synchronize data from a third party data source with a local collection of datastores. * * Converts the third party into an appropriate Verida schema. * @@ -120,17 +156,11 @@ export default class Controller { * @param next * @returns */ - public static async sync(req: Request, res: Response, next: any) { + public static async _sync(providerName: string, did: string, encryptionKey: Uint8Array, accessToken: string, refreshToken: string, res: Response, syncSchemas: Record = {}) { const { account, context } = await Utils.getNetwork() const serverDid = await account.did() - - const providerName = req.params.provider const provider = Providers(providerName) - const query = req.query - const did = query.did.toString() - const encryptionKey = Buffer.from(query.key.toString(), 'hex') - // Generate a new sync request const syncRequestDatabaseName = EncryptionUtils.hash(`${did}-${DATA_SYNC_REQUEST_SCHEMA}`) const syncRequestDatastore = await context.openDatastore(DATA_SYNC_REQUEST_SCHEMA, { @@ -165,7 +195,7 @@ export default class Controller { // Fetch the necessary data from the provider let data: any = {} try { - data = await provider.syncFromRequest(req, res, next) + data = await provider.sync(accessToken, refreshToken, syncSchemas) } catch (err: any) { syncRequest.status = 'error' if (err instanceof TokenExpiredError) { @@ -344,16 +374,12 @@ export default class Controller { * @returns */ public static async syncDone(req: Request, res: Response, next: any) { - logger.trace(`syncDone()`) - return res.send({ - success: true - }) const providerName = req.params.provider const provider = Providers(providerName) const schemaUris = provider.schemaUris() const query = req.query - const did: string = query.did.toString() + const did = query.did.toString() const { context } = await Utils.getNetwork() @@ -375,7 +401,7 @@ export default class Controller { try { // @todo: use `db.destroy()` once its released - await db._localDb.destroy() + await db.destroy() clearedDatabases.push(schemaUri) } catch (err) { logger.error(err.status, err.name) diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index 1148403e..f15469f5 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -21,6 +21,11 @@ export interface AccountProfile { credential?: string } +export interface SyncSchemaConfig { + limit?: number + sinceId?: string +} + export default class BaseProvider { protected icon?: string @@ -98,16 +103,7 @@ export default class BaseProvider { return this.profile } - public async syncFromRequest(req: Request, res: Response, next: any): Promise { - const query = req.query - const accessToken = query.accessToken ? query.accessToken.toString() : '' - const refreshToken = query.refreshToken ? query.refreshToken.toString() : '' - - return this.sync(accessToken, refreshToken) - } - /** - * * Must update `profile` or `newAuth` if they have changed * * @param accessToken @@ -115,24 +111,30 @@ export default class BaseProvider { * @param schemaUri * @returns */ - public async sync(accessToken: string, refreshToken: string, schemaUri?: string): Promise { - const api = await this.getApi(accessToken, refreshToken) - const results = [] - - const handlers = this.syncHandlers() - for (let h in handlers) { - const handler = handlers[h] - - if (schemaUri && handler.getSchemaUri() != schemaUri) { - continue + public async sync(accessToken: string, refreshToken: string, syncSchemas: Record = {}): Promise { + try { + const api = await this.getApi(accessToken, refreshToken) + const results = [] + + const handlers = this.syncHandlers() + const schemaList = Object.keys(syncSchemas) + for (let h in handlers) { + const handler = handlers[h] + + if (schemaList.length && schemaList.indexOf(handler.getSchemaUri()) === -1) { + // Schema list exists, but not found + continue + } + + const handlerInstance = new handler(this.config, this.profile) + const handlerResults = await handlerInstance.sync(api, syncSchemas[handler.getSchemaUri()]) + results[handler.getSchemaUri()] = handlerResults } - - const handlerInstance = new handler(this.config, this.profile) - const handlerResults = await handlerInstance.sync(api) - results[handler.getSchemaUri()] = handlerResults - } - return results + return results + } catch (err) { + console.log(err) + } } // Set new authentication credentials for this provider instance, if they changed diff --git a/src/providers/BaseSyncHandler.ts b/src/providers/BaseSyncHandler.ts index 138b31d3..11c8b965 100644 --- a/src/providers/BaseSyncHandler.ts +++ b/src/providers/BaseSyncHandler.ts @@ -1,4 +1,4 @@ -import { AccountProfile } from "./BaseProvider" +import { AccountProfile, SyncSchemaConfig } from "./BaseProvider" export default class BaseSyncHandler { @@ -18,7 +18,7 @@ export default class BaseSyncHandler { /** * Implement this sync method to generate data for the schemaUri of this sync handler */ - public async sync(api: any): Promise { + public async sync(api: any, syncConfig: SyncSchemaConfig): Promise { throw new Error('Not implemented') } } \ No newline at end of file diff --git a/src/routes.ts b/src/routes.ts index e24443a8..775970be 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -7,6 +7,7 @@ const router = express.Router() router.get('/connect/:provider', Controller.connect) router.get('/callback/:provider', Controller.callback) router.get('/sync/:provider', Controller.sync) +router.post('/syncStart/:provider', Controller.syncStart) router.get('/syncDone/:provider', Controller.syncDone) router.post('/mintSbt', SbtController.mintSbt) diff --git a/tests/common.utils.ts b/tests/common.utils.ts index 766ae625..46d98587 100644 --- a/tests/common.utils.ts +++ b/tests/common.utils.ts @@ -18,6 +18,11 @@ const DATA_SYNC_REQUEST_SCHEMA = 'https://vault.schemas.verida.io/data-connectio const axios = Axios.create() +export interface SyncSchemaConfig { + limit?: number + sinceId?: string +} + export default class CommonUtils { static getNetwork = async (): Promise => { @@ -44,8 +49,22 @@ export default class CommonUtils { } } - static syncConnector = async (provider: string, accessToken: string, refreshToken: string, did: string, encryptionKey: string): Promise => { - return await axios.get(`${SERVER_URL}/sync/${provider}?accessToken=${accessToken}&refreshToken=${refreshToken}&did=${did}&key=${encryptionKey}`) + static syncConnector = async (provider: string, accessToken: string, refreshToken: string, did: string, encryptionKey: string, syncSchemas: Record): Promise => { + return await axios.post(`${SERVER_URL}/syncStart/${provider}`, { + accessToken, + refreshToken, + did, + key: encryptionKey, + syncSchemas + }) + } + + static syncDone = async (provider: string, did: string): Promise => { + return await axios.get(`${SERVER_URL}/syncDone/${provider}`, { + params: { + did + } + }) } static async openSchema(context: Context, contextName: string, schemaName: string, databaseName: string, encryptionKey: string, externalDid: string, did: string): Promise { @@ -81,9 +100,9 @@ export default class CommonUtils { serverDid, connection.did) syncResult = await syncRequest.get(syncRequestId) + await CommonUtils.closeDatastore(syncRequest) break } catch (err) { - console.log(err.message) limit-- await CommonUtils.sleep(1000) } diff --git a/tests/server.tests.ts b/tests/server.tests.ts index 072c7339..55a34a12 100644 --- a/tests/server.tests.ts +++ b/tests/server.tests.ts @@ -33,32 +33,48 @@ describe(`${providerName} Tests`, function() { ) const info = await (await followingDatastore.getDb()).info() - encryptionKey = info.encryptionKey - //console.log(info) + encryptionKey = Buffer.from(info.encryptionKey).toString('hex') await CommonUtils.closeDatastore(followingDatastore) }) it(`Can sync ${providerName}`, async () => { - const syncRequestResult = await CommonUtils.syncConnector(providerName, creds.accessToken, creds.refreshToken, connection.did, encryptionKey) - - console.log(syncRequestResult.data) - - const { serverDid, contextName, syncRequestId, syncRequestDatabaseName } = syncRequestResult.data - - /*this.checkSync( - serverDid, - contextName, - syncRequestId, - syncRequestDatabaseName + const syncSchemas = {} + syncSchemas[SCHEMA_FOLLOWING] = { + limit: 10 + } + const syncRequestResult = await CommonUtils.syncConnector(providerName, creds.accessToken, creds.refreshToken, connection.did, encryptionKey, syncSchemas) + + const syncResult = await CommonUtils.getSyncResult(connection, syncRequestResult, encryptionKey) + const schemaResult = syncResult.syncInfo.schemas[SCHEMA_FOLLOWING] + + const followingDatastore = await CommonUtils.openSchema( + connection.context, + syncRequestResult.data.contextName, + SCHEMA_FOLLOWING, + schemaResult.databaseName, + schemaResult.encryptionKey, + syncRequestResult.data.serverDid, + syncRequestResult.data.did ) + + // Get all the data that was fetched + const syncData = await followingDatastore.getMany() - const syncData = await provider.sync(creds.accessToken, creds.refreshToken, SCHEMA_FOLLOWING) + // Close the database + await CommonUtils.closeDatastore(followingDatastore) + // Confirm we have the expected data assert.ok(syncData, 'Have data returned') - assert.ok(SCHEMA_POST in syncData, 'Have Post data in the response') - assert.equal(syncData[SCHEMA_POST].length, providerConfig.postLimit, `Correct number of posts received`)*/ + assert.equal(syncData.length, syncSchemas[SCHEMA_FOLLOWING].limit, 'Have correct number of items returned') + + // Cleanup by having the server delete it's database of data + await CommonUtils.syncDone(providerName, connection.did) }) + // confirm sync since last works for a given schema + + // confirm sync all works? + after(async () => { await connection.context.close({ clearLocal: true From c29904709df30394c26ec04f45932e64fe4abb89 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 5 Apr 2023 21:10:39 +0930 Subject: [PATCH 14/33] Update to latest verida protocol --- package.json | 16 ++-- yarn.lock | 223 ++++++++++++++++++++++++++------------------------- 2 files changed, 123 insertions(+), 116 deletions(-) diff --git a/package.json b/package.json index e58357be..09e1323d 100644 --- a/package.json +++ b/package.json @@ -27,15 +27,15 @@ "homepage": "https://github.com/verida/server-template#readme", "dependencies": { "@superfaceai/passport-twitter-oauth2": "^1.2.3", - "@verida/account-node": "^2.2.0", - "@verida/client-ts": "^2.2.0", - "@verida/did-client": "^2.2.0", - "@verida/encryption-utils": "^2.2.0", - "@verida/helpers": "^2.2.0", + "@verida/account-node": "^2.2.1", + "@verida/client-ts": "^2.2.1", + "@verida/did-client": "^2.2.1", + "@verida/encryption-utils": "^2.2.1", + "@verida/helpers": "^2.2.1", "@verida/types": "^2.2.0", - "@verida/vda-sbt-client": "^2.2.0", - "@verida/verifiable-credentials": "^2.2.0", - "@verida/web3": "^2.2.0", + "@verida/vda-sbt-client": "^2.2.1", + "@verida/verifiable-credentials": "^2.2.1", + "@verida/web3": "^2.2.1", "aws-serverless-express": "^3.4.0", "axios": "^1.2.3", "body-parser": "^1.19.0", diff --git a/yarn.lock b/yarn.lock index 172f57b9..037aa5c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -670,47 +670,47 @@ binary-case "^1.0.0" type-is "^1.6.16" -"@verida/account-node@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.2.0.tgz#8df17f61c5baebe3e7fde7c26f34e0c8c551cda0" - integrity sha512-e26lbV4izNxkN5FVVAIpo9UOVFtWjDLh/vpW7FyQHxBNGKmCgizI9FZkKHgCZNbqJgzy+k7WClGSLfyWhfiogA== - dependencies: - "@verida/account" "^2.2.0" - "@verida/did-client" "^2.2.0" - "@verida/did-document" "^2.2.0" - "@verida/encryption-utils" "^2.2.0" - "@verida/keyring" "^2.2.0" +"@verida/account-node@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.2.1.tgz#76982c74acd012e35cb13a9000cee4c2c63ec22a" + integrity sha512-83oXG3J4yRUWz6oOFXGGb2stzPKDMYFu5uCN2CnpLL7HlvRbVmHJXKAvDU80hr07I+yHgwO5qqiQcIJvmoNS/g== + dependencies: + "@verida/account" "^2.2.1" + "@verida/did-client" "^2.2.1" + "@verida/did-document" "^2.2.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.2.1" "@verida/types" "^2.2.0" axios "^0.27.2" did-resolver "^4.0.1" -"@verida/account@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.2.0.tgz#4c647d7ee20b199a2d239a21e373f0dde62a3620" - integrity sha512-UHxrpRPg4KIqLerrIgGuDMVCf7Mrk++YXYSMyvA0Oh0o1C1mx19AO7jgkSg3Vb4nV7iBnWL39PsiV07U6q1hzw== +"@verida/account@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.2.1.tgz#f15bb723c2dab20d56ac2212045ace161159cbfe" + integrity sha512-lKjIvRV73Z2lGcd6hzFQ/7LFn6NclDOZSrHrGqNTo4mUARt9X/uUlGXNgaZHFxuMYvjsiWjYdlshvYI33Ra+cg== dependencies: - "@verida/keyring" "^2.2.0" - "@verida/storage-link" "^2.2.0" + "@verida/keyring" "^2.2.1" + "@verida/storage-link" "^2.2.1" "@verida/types" "^2.2.0" did-jwt "^6.11.0" did-resolver "^4.0.1" lodash "^4.17.21" tweetnacl-util "^0.15.1" -"@verida/client-ts@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.2.0.tgz#cb11f24e85f2d7864029922e18854f8c98fbf463" - integrity sha512-Ue9fuKJQh05fnVQ0ibX91RYNj8Pi9ZXLct5dVYO2uSYDSFn0en86ARgx7Ou+O8GNPrGZCJelDWNf2sEWSf11RQ== - dependencies: - "@verida/account" "^2.2.0" - "@verida/account-node" "^2.2.0" - "@verida/did-client" "^2.2.0" - "@verida/did-document" "^2.2.0" - "@verida/encryption-utils" "^2.2.0" - "@verida/keyring" "^2.2.0" - "@verida/storage-link" "^2.2.0" +"@verida/client-ts@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.2.1.tgz#b9a2fc37817bcc8562aaf05f3d71909efe164917" + integrity sha512-QK+H5HJgtO7nhlOge8iltsU6E19yKGRece8sHlzIyvt9pfGx39VsG898p5vImJErOnAF7BAwTyJsuRHOyajIXg== + dependencies: + "@verida/account" "^2.2.1" + "@verida/account-node" "^2.2.1" + "@verida/did-client" "^2.2.1" + "@verida/did-document" "^2.2.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.2.1" + "@verida/storage-link" "^2.2.1" "@verida/types" "^2.2.0" - "@verida/vda-name-client" "^2.2.0" + "@verida/vda-name-client" "^2.2.1" ajv "^8.6.3" ajv-formats "^2.1.1" axios "^0.21.2" @@ -725,74 +725,74 @@ pouchdb-find "^7.2.2" uuid "^8.3.2" -"@verida/did-client@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.2.0.tgz#9d9c97a5035d48ba4de82b31f9b4d93daeeda653" - integrity sha512-peTjsisIbOmhhQN1s11hTUn5DLSQp/VEcUUfKx5YVmjraI2stwViS3QQ/EIdrUR3BPssmsGGA1PIEHQlWdOMJA== +"@verida/did-client@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.2.1.tgz#6ff80cdc519fb86705b4253a2f1704aaf4e225ad" + integrity sha512-8+mLcjw0AdVJK9Jfnyi6mXe2H0ExTNwkIAFS7dQazeoVyiGvIvkoNd5SOq0u+v9mrm1KdwBRMgtgFxKxQwaMxQ== dependencies: - "@verida/did-document" "^2.2.0" + "@verida/did-document" "^2.2.1" "@verida/types" "^2.2.0" - "@verida/vda-did-resolver" "^2.2.0" - "@verida/web3" "^2.2.0" + "@verida/vda-did-resolver" "^2.2.1" + "@verida/web3" "^2.2.1" axios "^0.23.0" deepcopy "^2.1.0" did-resolver "^4.0.1" ethers "^5.5.1" -"@verida/did-document@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.2.0.tgz#1c1337b89d0591961898013e8c974ac5e7aa4559" - integrity sha512-SO4gWj2dGSw37+QcrbHZp2GA7gJGT5SVhZWIoZ5CxqhUkftuMqzTmoSgixwqYdei6blmUfCFESx/PPZNZAfs4Q== +"@verida/did-document@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.2.1.tgz#6f2939a19bf0027ca8e26bf469404ae950a74193" + integrity sha512-QQKJj7viZf/S4LDT1+YqnhUEnuJxMzUtyGXNF1C4k5KkPNgGCd1GOi/lJtOZbfKI9UV17WYvCHAI1wr4nzkbsw== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" "@ethersproject/transactions" "^5.7.0" - "@verida/encryption-utils" "^2.2.0" - "@verida/keyring" "^2.2.0" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.2.1" "@verida/types" "^2.2.0" did-resolver "^4.0.1" lodash "^4.17.21" -"@verida/encryption-utils@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.2.0.tgz#cee371d205638eca4852deaddf805be9a19005a3" - integrity sha512-0OTeauQ46sOqcuFoM73dY29T7/i/ZP6vSFryG8Vcli6unAHmpJCnzoNse490iLHaZcKySdOG1mRnBhqw8rUpnw== +"@verida/encryption-utils@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.2.1.tgz#76104228a194187f8019bf97e6b609d6742c67a3" + integrity sha512-0UNlTd9In2JJD8Ov5RXX9t4ta52gtpwJvg00nR4oT8TpMH7B2SEaLzJZqvBK3cRb3Y5IMJxdmjDhiParj9a+zw== dependencies: ethers "^5.5.1" json.sortify "^2.2.2" tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@verida/helpers@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.2.0.tgz#1de0e0b79dbaa59ed3623535192de456e9f1308a" - integrity sha512-xyHJYsPeNpvUaiJjyz3RK1WyG9BsMpa3m9rZkwHh4BWyWn20358QAWl36Y5EDjQzHeZVgDM3f/ejePfnqbWbAw== +"@verida/helpers@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.2.1.tgz#f3ea2b183e133d9f96c052b7b65da694bfed8c2f" + integrity sha512-Ozv9UTgHs3aLPOB1D7Cg/dvDl1GzAtSkGrP+eddUkZHpI5tp2b6W4McUd7sWDdERAmPAuKbeWeAZdnMXgRSlSQ== dependencies: - "@verida/encryption-utils" "^2.2.0" + "@verida/encryption-utils" "^2.2.1" "@verida/types" "^2.2.0" bs58 "^5.0.0" url "^0.11.0" -"@verida/keyring@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.2.0.tgz#c7f7ace4b47ec8bceb626210b2f38d20b4f1e360" - integrity sha512-fF1p3WtgA3B4HYDOqVdO/WtzATx+54kBU7YP7+jUY+DY4XRRgNX/h5FpIfefey4kMulEZzgj75ZryfppQAUK/w== +"@verida/keyring@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.2.1.tgz#1114835c381670a75f2549a6b25c9e9d668d846e" + integrity sha512-IhzdWTWtBFigc7Q98CQdh25Tr6iFrwZ0fWdhR8UE1EDgLf27h2aAukm5a23jhAiO5ILW8tD7KW6dyEanfayQ4w== dependencies: - "@verida/encryption-utils" "^2.2.0" + "@verida/encryption-utils" "^2.2.1" "@verida/types" "^2.2.0" ethers "^5.5.1" tweetnacl "^1.0.3" uuid "^8.3.2" -"@verida/storage-link@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.2.0.tgz#8d06cba75f0a748fd21ed46afde544ebf1f2bf70" - integrity sha512-CXoYnx2l6kl4PWDUEIkxIJ0uoGJvygYYNFLJqXhWamuckG8oxympYyDZA1hhusMersgaDwTUNgt3NnpNJnLimg== +"@verida/storage-link@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.2.1.tgz#bf3b5b61f5c767340b6095ca36c6a163fad16b7c" + integrity sha512-pv6io0Fp9KYfPvO9reEdlGN3O9jb2qhYGIIsYTjqzqB3OS/aCkybJjzG2YD/zzcnnixV9q/yk9SRO2U8WFu/uQ== dependencies: - "@verida/did-client" "^2.2.0" - "@verida/did-document" "^2.2.0" - "@verida/encryption-utils" "^2.2.0" - "@verida/keyring" "^2.2.0" + "@verida/did-client" "^2.2.1" + "@verida/did-document" "^2.2.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.2.1" did-resolver "^4.0.0" url-parse "^1.5.3" @@ -807,61 +807,63 @@ did-resolver "^4.0.1" tweetnacl "^1.0.3" -"@verida/vda-did-resolver@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.2.0.tgz#d54ef234e4fdfb877409ffd27a833c1d9cb30ac7" - integrity sha512-IzFy1zl8QYshs+aZLTR/OXgyD2mqCdqt1ydEUvCsyi3yx/hNVoWXnyEAPdKZwZTtQRLsh5oidUwl73t83/37vg== +"@verida/vda-did-resolver@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.2.1.tgz#91f0f49ea0573181b4beb2b8157c79d5ca289642" + integrity sha512-uK6tvS3D+oNFM65EH7I6gdtPjVFH/1ULjIR09dgAbUXeaPSq4sX5zbkFe8+iUzNfB4lKne2ZRsa2u5lL66Upww== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/did-document" "^2.2.0" - "@verida/encryption-utils" "^2.2.0" + "@verida/did-document" "^2.2.1" + "@verida/encryption-utils" "^2.2.1" "@verida/types" "^2.2.0" - "@verida/vda-did" "^2.2.0" + "@verida/vda-did" "^2.2.1" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/vda-did@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.2.0.tgz#0dd7e47d1bca6bae9d458c1144280c3d7cc19ce4" - integrity sha512-ESZceZeVpwx0+L9cxeRhBApRoM3k2sB43MBNGZjvjTP0YtinwA+85r1rPnP7ZKsmpuc340YLIsPA/tpDfsxhWQ== +"@verida/vda-did@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.2.1.tgz#e5fc89f87678e2c698cbfbba655d33d6bbcc8958" + integrity sha512-SZYHtkBEOeR/BMv1ui+wBu9dVNmd+gGBeAWBzfjV9l8N1DxYAGnRnO/VqPa0c7d4JvpNBLwBvyb9GaTFEi7waQ== dependencies: - "@verida/did-document" "^2.2.0" - "@verida/encryption-utils" "^2.2.0" + "@verida/did-document" "^2.2.1" + "@verida/encryption-utils" "^2.2.1" "@verida/types" "^2.2.0" - "@verida/web3" "^2.2.0" + "@verida/web3" "^2.2.1" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/vda-name-client@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-2.2.0.tgz#5786b06f6ab97fec2c6c43c8e12a185b0d103262" - integrity sha512-AMD9QCV3FJ9zfMy3iNzB0xSuhYGiU/vAutfisMzn8PFWJGNODfn4+Xc+77F8J/xCmasBQjKtvbgJaB3qPb+ryQ== +"@verida/vda-name-client@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-2.2.1.tgz#74327711565237635dd3a45cb47b1cb4af4bcb13" + integrity sha512-NMkJvRFN4/x1ba64cCRN8Bd4aZs8RcWAM+f+RI3zDyJI4VRw9MZ8xxNAu4Q2Bw6GjwrpAVfj/OlcCkOxmEv2sw== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/helpers" "^2.2.0" + "@verida/helpers" "^2.2.1" "@verida/types" "^2.2.0" - "@verida/web3" "^2.2.0" + "@verida/web3" "^2.2.1" axios "^0.27.2" ethers "^5.7.0" -"@verida/vda-sbt-client@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/vda-sbt-client/-/vda-sbt-client-2.2.0.tgz#4b675393e0d197c3c9c3abe01065fe3c41f9218e" - integrity sha512-B7GuxQQbUlzaYV/JJtb1qvykSlKezH1f+URBTb9dh51vv2PHvFNxMhbDzqo1ByPtWwjDvxdq+Wezy7tBqOyLrw== +"@verida/vda-sbt-client@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/vda-sbt-client/-/vda-sbt-client-2.2.1.tgz#9b5b2bda2705694f739034a5f7859593c6f396f1" + integrity sha512-SrqdM0HEnxzAybVpn9yyy0WL1ZSIvoPxwTmBOkrlPb/86/bsZIYiC1Iuae2g8XsdCu06S1I+gr/Qu8EzdyBTrw== dependencies: - "@verida/web3" "^2.2.0" + "@ethersproject/providers" "^5.7.2" + "@verida/helpers" "^2.2.1" + "@verida/web3" "^2.2.1" axios "^0.27.2" ethers "^5.7.0" -"@verida/verifiable-credentials@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/verifiable-credentials/-/verifiable-credentials-2.2.0.tgz#abd842f2968ca72678e17ec666d9b880905ad6ae" - integrity sha512-UBEKIHba1YkdFDqCBqt+WlKMCdxgu0eWRa7aSUW9zl6CsjhIiOZ+JN1ZYG7w8tMaQEDtiK8Z03xE8UM+apr9tA== +"@verida/verifiable-credentials@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/verifiable-credentials/-/verifiable-credentials-2.2.1.tgz#beda4742f7cc8cdfada13ccf404c36fa36b546f0" + integrity sha512-oQ0RR3NLchrlnYhICqP8JZBSFBn2W1ZTUWUoJnJkspP5p4AGAET58ZizHtYWqL5D26RdYrDrNq0kIoHxG9y4Og== dependencies: - "@verida/encryption-utils" "^2.2.0" - "@verida/helpers" "^2.2.0" + "@verida/encryption-utils" "^2.2.1" + "@verida/helpers" "^2.2.1" "@verida/types" "^2.2.0" - "@verida/vda-did-resolver" "^2.2.0" + "@verida/vda-did-resolver" "^2.2.1" axios "^1.3.3" dayjs "^1.10.7" did-jwt "^6.11.0" @@ -870,10 +872,10 @@ tweetnacl-util "^0.15.1" url "^0.11.0" -"@verida/web3@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.2.0.tgz#a3b22893467df2b8afd351dfb4d8b466346f2c2c" - integrity sha512-9jRHEWJMJfpN82svRJAb4SUQx9JgFJwt5GENnzM2EJThGTnTzLB4iwlvu+9pv81IP3+kx5UlDKf986Af0Z6vTg== +"@verida/web3@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.2.1.tgz#16b338ed5b452a3269fdf2752a3d255ad7807744" + integrity sha512-5h6STyoKkZUDGVgoZt6CSOT09HzHdFV1MlshzDf4wqe2eT1hLzfyZsruSZiu20iiW/HgX4AwgBjH0o4Ga1ddrg== dependencies: axios "^1.2.3" ethers "^5.7.0" @@ -1389,11 +1391,16 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -canonicalize@^1.0.5, canonicalize@^1.0.8: +canonicalize@^1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" integrity sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A== +canonicalize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-2.0.0.tgz#32be2cef4446d67fd5348027a384cae28f17226a" + integrity sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1739,9 +1746,9 @@ destroy@1.2.0: integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== did-jwt-vc@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-3.1.1.tgz#393ef7e880b14068b228ddfe54cae50aa3aadc97" - integrity sha512-1fuxCqQ73gQCMp7vY1/lYyp0T69GxQQ46CoYQQgSr73eCvw6wor4rqvixZsJ+uPU1LFDAmq6lvO1ExNbeRZJyw== + version "3.1.3" + resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-3.1.3.tgz#a5dabf2442752e1666f54ef2dbe01befcc83987f" + integrity sha512-qB1FiQ0sT/FUR5+mQ//P5lS0Gllrtes2OxC3WVMOt8ND0LolF92ohozv50ukyOvB2zBzgfm5durcIPqQcoI+LA== dependencies: did-jwt "^6.11.0" did-resolver "^4.0.0" @@ -1763,9 +1770,9 @@ did-jwt@5.7.0: uint8arrays "^3.0.0" did-jwt@^6.11.0: - version "6.11.2" - resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.11.2.tgz#64d5f2cd32370946caef389e1e58408225b0f4c1" - integrity sha512-7YZEY2Jh1bnPdFunvVT5EETuGMbCSEw7PMoNqpeKVtVVk02rTjU/xvIfnBdqnhEHSb7OGu6kb7crtM6kpOGb1A== + version "6.11.6" + resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.11.6.tgz#3eeb30d6bd01f33bfa17089574915845802a7d44" + integrity sha512-OfbWknRxJuUqH6Lk0x+H1FsuelGugLbBDEwsoJnicFOntIG/A4y19fn0a8RLxaQbWQ5gXg0yDq5E2huSBiiXzw== dependencies: "@stablelib/ed25519" "^1.0.2" "@stablelib/random" "^1.0.1" @@ -1773,7 +1780,7 @@ did-jwt@^6.11.0: "@stablelib/x25519" "^1.0.2" "@stablelib/xchacha20poly1305" "^1.0.1" bech32 "^2.0.0" - canonicalize "^1.0.8" + canonicalize "^2.0.0" did-resolver "^4.0.0" elliptic "^6.5.4" js-sha3 "^0.8.0" From 3bb7e5b3c37a40bc3b8ca89c12b3241c62565bd6 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 5 Apr 2023 21:14:12 +0930 Subject: [PATCH 15/33] Remove SBTs from the server --- src/controller.ts | 60 ++++++-------------- src/routes.ts | 3 - src/sbtController.ts | 127 ------------------------------------------ tests/common.utils.ts | 11 ++-- 4 files changed, 20 insertions(+), 181 deletions(-) delete mode 100644 src/sbtController.ts diff --git a/src/controller.ts b/src/controller.ts index dfc14383..461fa413 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -304,60 +304,32 @@ export default class Controller { // This code loops through all the databases that were written to and // checks the encrypted database has enough records written before flagging // it as being fully sync'd - let count = 5 - while (count > 0) { - let completeCount = 0 - for (let i = 0; i < syncingDatabases.length; i++) { - const db = syncingDatabases[i] + for (let i = 0; i < syncingDatabases.length; i++) { + const db = syncingDatabases[i] - const remote = await db.getRemoteEncrypted() - const local = await db.getDb() - - const remoteInfo = await remote.info() - const localInfo = await local.info() - - if (remoteInfo.doc_count >= localInfo.doc_count) { - completeCount++ - } - } - - if (completeCount == syncingDatabases.length) { - // Update the sync request to say it has completed successfully - syncRequest.syncInfo.schemas = response - - syncRequest.status = "complete" - const res = await syncRequestDatastore.save(syncRequest) - if (!res) { - console.log(`Errors saving sync request`) - console.log(syncRequestDatastore.errors) - } - - logger.info(`Saved sync request indicating process is complete`) - // Wait 3 seconds to be super sure sync response is saved to DB - await delay(3000) - - await context.close({ - clearLocal: true - }) - - return - } + await db.close({ + clearLocal: true + }) - await delay(2000) - count-- + console.log('db closed...') } - // After 5x2 second delays, we still don't have sync so assume it has failed - syncRequest.status = "error" - syncRequest.syncInfo.error = "Server timed out syncing encrypted database" + // Wait 3 seconds to be super sure sync response is saved to DB + await delay(3000) - await syncRequestDatastore.save(syncRequest) + // Update the sync request to say it has completed successfully + syncRequest.syncInfo.schemas = response - logger.info(`Saved sync request indicating process has error`) + syncRequest.status = "complete" + await syncRequestDatastore.save(syncRequest) + + await delay(3000) await context.close({ clearLocal: true }) + + return } /** diff --git a/src/routes.ts b/src/routes.ts index 775970be..394404ff 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,6 +1,5 @@ import express from 'express' import Controller from './controller' -import SbtController from './sbtController' const router = express.Router() @@ -10,6 +9,4 @@ router.get('/sync/:provider', Controller.sync) router.post('/syncStart/:provider', Controller.syncStart) router.get('/syncDone/:provider', Controller.syncDone) -router.post('/mintSbt', SbtController.mintSbt) - export default router \ No newline at end of file diff --git a/src/sbtController.ts b/src/sbtController.ts deleted file mode 100644 index 9f5b7c59..00000000 --- a/src/sbtController.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { AutoAccount } from '@verida/account-node' -import { Request, Response } from 'express' -import { VeridaSBTClient, SBTClientConfig } from "@verida/vda-sbt-client" -import { Utils, WHITELIST_SBT_ISSUERS, VERIDA_ENVIRONMENT, CONTEXT_NAME, DID_CLIENT_CONFIG } from './utils' -import { Credentials } from '@verida/verifiable-credentials' -import { fetchVeridaUri, explodeVeridaUri, wrapUri } from '@verida/helpers' -import { Context } from '@verida/client-ts' -import { DIDClient } from '@verida/did-client' -import { Web3CallType } from '@verida/types' - -const SCHEMA_SBT_CREDENTIAL = 'https://common.schemas.verida.io/token/sbt/credential/v0.1.0/schema.json' - -export default class SbtController { - - public static async mintSbt(req: Request, res: Response) { - // verify issuer is this server's DID - - // @ts-ignore - const { credentialUri } = req.body - if (!credentialUri) { - return res.status(400).send({ - status: "fail", - message: `'credentialUri' is required` - }) - } - - const { mintAddress } = req.body - if (!mintAddress) { - return res.status(400).send({ - status: "fail", - message: `'mintAddress' is required` - }) - } - - // Fetch credential record from the network - const networkInfo = await Utils.getNetwork() - const context = networkInfo.context - const credentialRecord = await fetchVeridaUri(credentialUri, context) - - // Generate URL to mint that generates the metadata - const sbtUri = wrapUri(credentialUri) - - const credentials = new Credentials() - try { - //const sbtClient = await SbtController.getSbtClient() - const generatedCredential = await credentials.verifyCredential(credentialRecord.didJwtVc, {}) - const sbtData = generatedCredential.verifiableCredential.credentialSubject - const proofs = generatedCredential.payload.vc.proofs - const vcIssuerDid = generatedCredential.payload.iss - - // Verify the DIDJWTVC is a valid SBT credential issued by a whitelisted DID - await SbtController.verifyDidJwtVc(generatedCredential, WHITELIST_SBT_ISSUERS, sbtData.did) - - // Get the context proof of the issuer - // (Links their DID to the signing key of the context that signed the credential proof) - const didClient = new DIDClient({ - network: VERIDA_ENVIRONMENT - }) - const issuerDidDoc = await didClient.get(vcIssuerDid) - const issuerContextProof = issuerDidDoc.locateContextProof(generatedCredential.payload.vc.veridaContextName) - - // Initiate a SBT claim on-chain - const sbtClient = await SbtController.getSbtClient() - - await sbtClient.claimSBT(sbtData.type, sbtData.uniqueAttribute, sbtUri, mintAddress, proofs['type-unique-didAddress'], issuerContextProof) - - return res.status(200).send({ - status: "success", - data: { - transactionId: '123' - } - }) - } catch (err: any) { - console.log(err) - return res.status(400).send({ - status: "fail", - message: err.message - }) - } - } - - private static async verifyDidJwtVc(generatedCredential: any, issuerDids: string[], subjectDid: string) { - // Verify credential signed by this issuer - const verifiableCredential = generatedCredential.verifiableCredential - - let issuerFound = false - issuerDids.forEach((issuerDid) => { - if (verifiableCredential.vc.issuer.toLowerCase() == issuerDid.toLowerCase()) { - issuerFound = true - } - }) - if (!issuerFound) { - throw new Error('Untrusted credential signer') - } - - // Verify subject DID is the one hosting the credential - if (verifiableCredential.vc.sub.toLowerCase() != subjectDid.toLowerCase()) { - throw new Error('Credential not published to the network by credential subject') - } - - if (verifiableCredential.credentialSchema.id != SCHEMA_SBT_CREDENTIAL) { - throw new Error('Invalid credential schema') - } - } - - private static async getSbtClient(): Promise { - const networkInfo = await Utils.getNetwork() - const account = networkInfo.account - const keyring = await account.keyring(CONTEXT_NAME) - const keys = await keyring.getKeys() - const did = await account.did() - const didAddress = did.match(/(0x.*)/)[0] - - const config: SBTClientConfig = { - callType: DID_CLIENT_CONFIG.callType, - identifier: didAddress, - signKey: `0x${Buffer.from(keys.signPrivateKey).toString('hex')}`, - chainNameOrId: VERIDA_ENVIRONMENT, - web3Options: DID_CLIENT_CONFIG.web3Config - } - - return new VeridaSBTClient(config) - } - - - -} \ No newline at end of file diff --git a/tests/common.utils.ts b/tests/common.utils.ts index 46d98587..d557e824 100644 --- a/tests/common.utils.ts +++ b/tests/common.utils.ts @@ -101,6 +101,10 @@ export default class CommonUtils { connection.did) syncResult = await syncRequest.get(syncRequestId) await CommonUtils.closeDatastore(syncRequest) + + if (syncResult.status == 'requested') { + continue + } break } catch (err) { limit-- @@ -115,13 +119,6 @@ export default class CommonUtils { } } - static mintSBT = async(credentialUri: string, mintAddress: string): Promise => { - return await axios.post(`${SERVER_URL}/mintSbt`, { - credentialUri, - mintAddress - }) - } - static closeDatastore = async (datastore: Datastore) => { await datastore.close({ clearLocal: true From 10f6f53d0c3b0d21dbc2161ffbf71be552f001c4 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 15 Apr 2023 10:06:55 +0930 Subject: [PATCH 16/33] Add discord auth support --- package.json | 6 + src/providers/discord/index.ts | 166 ++++++++++++++++++++++++ yarn.lock | 224 ++++++++++++++++++++++++++++++++- 3 files changed, 392 insertions(+), 4 deletions(-) create mode 100644 src/providers/discord/index.ts diff --git a/package.json b/package.json index 09e1323d..0634444d 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,13 @@ "bugs": { "url": "https://github.com/verida/server-template/issues" }, + "engines": { + "node": ">=16.06" + }, "homepage": "https://github.com/verida/server-template#readme", "dependencies": { + "@oauth-everything/passport-discord": "^1.0.2", + "@sapphire/snowflake": "^3.4.2", "@superfaceai/passport-twitter-oauth2": "^1.2.3", "@verida/account-node": "^2.2.1", "@verida/client-ts": "^2.2.1", @@ -41,6 +46,7 @@ "body-parser": "^1.19.0", "cors": "^2.8.5", "dayjs": "^1.11.1", + "discord.js": "^14.9.0", "dotenv": "^8.2.0", "express": "^4.17.1", "express-basic-auth": "git+https://github.com/Mozzler/express-basic-auth.git", diff --git a/src/providers/discord/index.ts b/src/providers/discord/index.ts new file mode 100644 index 00000000..0958aaf2 --- /dev/null +++ b/src/providers/discord/index.ts @@ -0,0 +1,166 @@ +import { Request, Response } from 'express' +import Base from "../BaseProvider" +import BaseProviderConfig from '../BaseProviderConfig' + +const passport = require("passport") +import { Strategy as DiscordStrategy, Scope } from '@oauth-everything/passport-discord'; +import { REST } from 'discord.js' +import { DiscordSnowflake } from '@sapphire/snowflake' +import dayjs from 'dayjs' +import axios from 'axios' + +//import Following from './following' +//import Posts from './posts' +import TokenExpiredError from '../TokenExpiredError' + +export interface DiscordProviderConfig extends BaseProviderConfig { + clientID: string + clientSecret: string + callbackUrl: string + limitResults: boolean +} + +// Note: If scopes change a user needs to disconnect and reconnect the app +const SCOPE = [Scope.IDENTIFY, Scope.EMAIL, Scope.GUILDS, Scope.GUILDS_JOIN] + +export default class DiscordProvider extends Base { + + protected config: DiscordProviderConfig + + public getProviderId() { + return 'discord' + } + + public getProviderLabel() { + return 'Discord' + } + + public syncHandlers(): any[] { + /*return [ + Following, + Posts + ]*/ + return [] + } + + public async connect(req: Request, res: Response, next: any): Promise { + console.log('connect') + this.init() + const auth = await passport.authenticate(this.getProviderId()) + return auth(req, res, next) + } + + /** + * @todo: Create proper connectionToken response + * + * @param req + * @param res + * @param next + * @returns + */ + public async callback(req: Request, res: Response, next: any): Promise { + this.init() + + const promise = new Promise((resolve, rejects) => { + const auth = passport.authenticate(this.getProviderId(), { + scope: SCOPE, + failureRedirect: '/failure/discord', + failureMessage: true + }, function(err: any, data: any) { + if (err) { + rejects(err) + } else { + const connectionToken = { + id: data.profile.id, + accessToken: data.accessToken, + refreshToken: data.refreshToken, + profile: data.profile + } + + resolve(connectionToken) + } + }) + + auth(req, res, next) + }) + + const result = await promise + return result + } + + public async getApi(accessToken?: string, refreshToken?: string): Promise { + let me: any, client: REST + + try { + client = new REST({ version: '10', authPrefix: 'Bearer' }).setToken(accessToken); + me = await client.get('/users/@me') + } catch (err: any) { + if (err.status && (err.status == 401 || err.status == 403)) { + console.log('token has expired, fetch a new one') + + try { + const requestData = { + client_id: this.config.clientID, + client_secret: this.config.clientSecret, + grant_type: 'refresh_token', + refresh_token: refreshToken + } + const newTokenResponse = await axios.post('https://discord.com/api/v10/oauth2/token', requestData, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + + const { access_token, refresh_token } = newTokenResponse.data + this.setAccountAuth(access_token, refresh_token) + + client = new REST({ version: '10', authPrefix: 'Bearer' }).setToken(access_token); + me = await client.get('/users/@me') + } catch (err) { + // Unrecoverable auth error + throw new TokenExpiredError(err.message) + } + } else { + throw err + } + } + + // ID's are based on timestamp of creation + // @see https://github.com/discordjs/discord.js/blob/384b4d10e8642f0f280ea1651f33cd378c341333/packages/discord.js/src/structures/User.js#L130 + const createdTimestamp = DiscordSnowflake.timestampFrom(me.id) + const createdAt = dayjs(createdTimestamp).toISOString() + + // Note: Discord doesn't have the concept of a profile `url` or `description` + this.profile = { + id: me.id, + name: me.display_name ? me.display_name : me.username, + username: me.username, + // use user custom avatar if set, otherwise use default discord avatar + avatarUrl: me.avatar ? client.cdn.avatar(me.id, me.avatar) : client.cdn.defaultAvatar(me.discriminator % 5), + createdAt + } + + return client + } + + public init() { + // obtain a new access token from refresh token + passport.use(new DiscordStrategy({ + clientID: this.config.clientID, + clientSecret: this.config.clientSecret, + callbackURL: this.config.callbackUrl, + scope: SCOPE, + }, + function(accessToken: string, refreshToken: string, profile: any, cb: any) { + // Simply return the raw data + return cb(null, { + accessToken, + refreshToken, + profile + }) + } + )); + } + +} + diff --git a/yarn.lock b/yarn.lock index 037aa5c3..f0a2d65c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,50 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" +"@discordjs/builders@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.6.1.tgz#5b1447cfa493bc1306671ef18ce3aae13c0af0ba" + integrity sha512-CCcLwn/8ANhlAbhlE18fcaN0hfXTen53/JiwZs1t9oE/Cqa9maA8ZRarkCIsXF4J7J/MYnd0J6IsxeKsq+f6mw== + dependencies: + "@discordjs/formatters" "^0.3.0" + "@discordjs/util" "^0.2.0" + "@sapphire/shapeshift" "^3.8.1" + discord-api-types "^0.37.37" + fast-deep-equal "^3.1.3" + ts-mixer "^6.0.3" + tslib "^2.5.0" + +"@discordjs/collection@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.0.tgz#478acd5d510cb5996c5101f47b24959ac7499cc2" + integrity sha512-suyVndkEAAWrGxyw/CPGdtXoRRU6AUNkibtnbJevQzpelkJh3Q1gQqWDpqf5i39CnAn5+LrN0YS+cULeEjq2Yw== + +"@discordjs/formatters@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.0.tgz#8313d158c5e974597eec43b1f381d870a507d133" + integrity sha512-Fc4MomalbP8HMKEMor3qUiboAKDtR7PSBoPjwm7WYghVRwgJlj5WYvUsriLsxeKk8+Qq2oy+HJlGTUkGvX0YnA== + dependencies: + discord-api-types "^0.37.37" + +"@discordjs/rest@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-1.7.0.tgz#c61fcd14e810b44e4821df5dfb5e74fa5fcb6e5d" + integrity sha512-r2HzmznRIo8IDGYBWqQfkEaGN1LrFfWQd3dSyC4tOpMU8nuVvFUEw6V/lwnG44jyOq+vgyDny2fxeUDMt9I4aQ== + dependencies: + "@discordjs/collection" "^1.5.0" + "@discordjs/util" "^0.2.0" + "@sapphire/async-queue" "^1.5.0" + "@sapphire/snowflake" "^3.4.0" + discord-api-types "^0.37.37" + file-type "^18.2.1" + tslib "^2.5.0" + undici "^5.21.0" + +"@discordjs/util@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-0.2.0.tgz#91b590dae3934ffa5fe34530afc5212c569d6751" + integrity sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg== + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -359,6 +403,47 @@ resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== +"@oauth-everything/oauth2-types@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@oauth-everything/oauth2-types/-/oauth2-types-1.0.2.tgz#1662a99d1b5f507efb9476e1e2cd7b50be91caea" + integrity sha512-fGddJhO8bnvljIhSTMuOSWFilkJ67TDqqgB1/qPVCu6s8swju7qWYZm2Qyit0miBebTtCf1jQ6hcz+GPA7glJw== + dependencies: + "@types/express" "^4.17.2" + "@types/passport-oauth2" "^1.4.8" + +"@oauth-everything/passport-discord@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@oauth-everything/passport-discord/-/passport-discord-1.0.2.tgz#c8c227b1e0f50e54281edce3ef8dfec8d4a01f1e" + integrity sha512-N+n8ICOADti8vJUBLb9FEHeroMb7Cdvu18moM0BgJIxXb1ZzxiYy02MyiMVyqFZGh/Tw7xJA2z9c7o0nQVQZ7g== + dependencies: + "@oauth-everything/oauth2-types" "^1.0.2" + "@oauth-everything/profile" "^1.0.0" + "@types/passport-oauth2" "^1.4.8" + passport-oauth2 "^1.5.0" + +"@oauth-everything/profile@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@oauth-everything/profile/-/profile-1.0.0.tgz#0b5e78749415519fa312dc83347a677903f456ba" + integrity sha512-OmCuBPhjaLHh9MST9P5jRuVBZaP0z7hBk8nH4Yt7Id5kNM1AXGd5uud6CP7W2zuhKl2nk0KsYmeMT7SkzN6VWg== + +"@sapphire/async-queue@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" + integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== + +"@sapphire/shapeshift@^3.8.1": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.8.2.tgz#f9f25cba74c710b56f8790de76a9642a9635e7db" + integrity sha512-NXpnJAsxN3/h9TqQPntOeVWZrpIuucqXI3IWF6tj2fWCoRLCuVK5wx7Dtg7pRrtkYfsMUbDqgKoX26vrC5iYfA== + dependencies: + fast-deep-equal "^3.1.3" + lodash "^4.17.21" + +"@sapphire/snowflake@^3.4.0", "@sapphire/snowflake@^3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.4.2.tgz#365af8e7b57ada924ec8e85383b921280f81d128" + integrity sha512-KJwlv5gkGjs1uFV7/xx81n3tqgBwBJvH94n1xDyH3q+JSmtsMeSleJffarEBfG2yAFeJiFA4BnGOK6FFPHc19g== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -517,6 +602,11 @@ dependencies: defer-to-connect "^1.0.1" +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -548,6 +638,15 @@ "@types/qs" "*" "@types/range-parser" "*" +"@types/express-serve-static-core@^4.17.33": + version "4.17.33" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/express-session@1.17.0": version "1.17.0" resolved "https://registry.yarnpkg.com/@types/express-session/-/express-session-1.17.0.tgz#770daf81368f6278e3e40dd894e1e52abbdca0cd" @@ -566,6 +665,16 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@^4.17.2": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/json-schema@^7.0.6": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -603,7 +712,7 @@ dependencies: "@types/node" "*" -"@types/passport-oauth2@>=1.4": +"@types/passport-oauth2@>=1.4", "@types/passport-oauth2@^1.4.8": version "1.4.12" resolved "https://registry.yarnpkg.com/@types/passport-oauth2/-/passport-oauth2-1.4.12.tgz#c2ae0ee3b16646188d8b0b6cdbc6880a0247dc5f" integrity sha512-RZg6cYTyEGinrZn/7REYQds6zrTxoBorX1/fdaz5UHzkG8xdFE7QQxkJagCr2ETzGII58FAFDmnmbTUVMrltNA== @@ -657,6 +766,13 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/ws@^8.5.4": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" @@ -1355,6 +1471,13 @@ buffer@^5.1.0, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -1807,6 +1930,30 @@ diff@^3.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +discord-api-types@^0.37.37: + version "0.37.38" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.38.tgz#0599937f64aff63a2b534376563021f17537d166" + integrity sha512-p9dibYycLXY1FUM9bIuohYeHHwa/634394QE90n6Tlb6ID5HtCtXBPYY68oaOlFnlFLBJAOYATMwX5oiV+VqiA== + +discord.js@^14.9.0: + version "14.9.0" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.9.0.tgz#61e26c4a7a27f91fd669b4c46892868420a5be43" + integrity sha512-ygGms5xP4hG+QrrY9k7d/OYCzMltSMtdl/2Snzq/nLCiZo+Sna91Ulv9l0+B5Jd/Czcq37B7wJAnmja7GOa+bg== + dependencies: + "@discordjs/builders" "^1.6.0" + "@discordjs/collection" "^1.5.0" + "@discordjs/formatters" "^0.3.0" + "@discordjs/rest" "^1.7.0" + "@discordjs/util" "^0.2.0" + "@sapphire/snowflake" "^3.4.0" + "@types/ws" "^8.5.4" + discord-api-types "^0.37.37" + fast-deep-equal "^3.1.3" + lodash.snakecase "^4.1.1" + tslib "^2.5.0" + undici "^5.21.0" + ws "^8.13.0" + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -2049,7 +2196,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -2077,6 +2224,15 @@ fetch-cookie@0.11.0: dependencies: tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0" +file-type@^18.2.1: + version "18.2.1" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.2.1.tgz#6d8f1fa3b079606f6ecf89483346f55fcd2c671b" + integrity sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg== + dependencies: + readable-web-to-node-stream "^3.0.2" + strtok3 "^7.0.0" + token-types "^5.0.1" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -2437,7 +2593,7 @@ ieee754@1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -2841,6 +2997,11 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -3223,7 +3384,7 @@ passport-oauth2@1.x.x: uid2 "0.0.x" utils-merge "1.x.x" -passport-oauth2@^1.6.1: +passport-oauth2@^1.5.0, passport-oauth2@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.7.0.tgz#5c4766c8531ac45ffe9ec2c09de9809e2c841fc4" integrity sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ== @@ -3278,6 +3439,11 @@ pbkdf2@^3.1.2: safe-buffer "^5.0.1" sha.js "^2.4.8" +peek-readable@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.0.0.tgz#7ead2aff25dc40458c60347ea76cfdfd63efdfec" + integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== + peek-stream@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/peek-stream/-/peek-stream-1.1.3.tgz#3b35d84b7ccbbd262fff31dc10da56856ead6d67" @@ -3618,6 +3784,13 @@ readable-stream@~0.0.2: resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d" integrity sha512-azrivNydKRYt7zwLV5wWUK7YzKTWs3q87xSmY6DlHapPrCvaT6ZrukvM5erV+yCSSPmZT8zkSdttOHQpWWm9zw== +readable-web-to-node-stream@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -3879,6 +4052,11 @@ streamroller@^3.1.1: debug "^4.3.4" fs-extra "^10.1.0" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -3929,6 +4107,14 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strtok3@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5" + integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^5.0.0" + supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -4004,6 +4190,14 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +token-types@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" + integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + touch@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" @@ -4050,6 +4244,11 @@ transform-pouch@^2.0.0: dependencies: pouchdb-wrappers "^5.0.0" +ts-mixer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" + integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== + ts-mocha@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-9.0.2.tgz#c1ef0248874d04a0f26dd9bd8d88e617a8d82ab1" @@ -4083,6 +4282,11 @@ tsconfig-paths@^3.5.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -4164,6 +4368,13 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +undici@^5.21.0: + version "5.21.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.21.2.tgz#329f628aaea3f1539a28b9325dccc72097d29acd" + integrity sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ== + dependencies: + busboy "^1.6.0" + unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -4361,6 +4572,11 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" From 2f40cbaeb433d7e5e51b14723873141f1c5a60b4 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 16 Apr 2023 11:17:54 +0930 Subject: [PATCH 17/33] Add placeholder discord icon --- assets/discord/icon.png | Bin 0 -> 21731 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/discord/icon.png diff --git a/assets/discord/icon.png b/assets/discord/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9af6b8a7b11599cb60ed5018d3953690f00b2f40 GIT binary patch literal 21731 zcmY(q1yGwo*EXDl;O_43T3mutin|qe*WwTyinh2rl;SPL-L1G5TA;YQOFsHOul)Z# zbI+dLTt_xL$)4GBZH$_VJUR*q3IG5=f2$y)0RRABMIZnP;k7Yx|6={G=b<4l1*n-I z+kfqZTj{;ER#pbEyvj%bcpwe{?jPiz8ju74|6eiypa>-WUs(gl^xqf|01#yd0RK0} z;I;ktD7?P^oc^bUD**nV#RAa(pn-q_xc`&?sijPLE50_!t_u1d001iPzZVF|${~8S zrf;XE=c%WxBy8d0#9?OXVs6FZXc9{1-y_RsJ{3 zNkjEt5Kjj&8a-t-DrpyYD=K~tE)FglaTF>lDp7Y!Yheu;x&Kyw?TOLYdV0DFb8>on zdvkd6a=5tLaB>R?32}1qaPsi5zarQ@e4RbbeAt~mX#Zp6f9%Lud04pHxq8~UI8*(z zYi91^95Fh(wV#L^ru*UfeOjk@}omj%yA{0;*zi=f9P zPvU)!D4rS)t_#^zwu1S1oE#N`a@-(d^cT?*QmpOy-=4acR{A?`P*4l%@bXeQC@9k@!9`e4djnOe!F*6D-)gcR-6Ade4f-5t z3f&o9j*5tHG>it1urWe{Om89&zba_+Df+Y7#|-i7=$;NcDGt-g%cbRw=%r}|u)KU7 zd2jsE`1?qwE((Eo_Oi7<3*?EN-gRC9>1@0YL1ZAwMyV98-)}>T;X{jLF<$I|Nlry@ zbC;8Z9({848X?@)S;feCkFe+4I3OM1u@j zvw9ANFc}p>)a!O7oKIA5^>T>@CG0^R$9yL7%DGaFbNH4>UqKhN!|5BSRHV)D_ih*X zHjN)P-_>r6=(?U-Z@HIy&Ud!%#>#o;lc7l^i{I{3+Lc55sO*BPgUmufiq(XgKYYfJ za{erw+?}4<@r~J+twf4Z`iNk%+$tI6If5%I`PmSh_ zlNn#iyIpZE|2kr!M0P3RSjBjLD2#hl8+00e;f-{1tn*7aS$$k)o}*d?-+x1!)TA{4 zQ&;?eOXMP6-u>vtqmj|>$1J?{4cKjBS`c%htXzpPSwA2^X)_Vo`b1q^<=)yl+L(PH z0(2QD?9+4_6q(wwV4d?TQiBL-5q8T6^vZ`6v|`T@Bpu~Vsdzf@Z=Cr`|0Oj@k6S6? z@PRF?1ZCEOCD)w8z2Bb>$%IH*RdM4B^I{fn8*Ki#>InR^e@k9-$Q|d~eG7kgQo8

;^{u3h4^TqmRZfZlw{Jt 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 O`czZWRxFXX3I8AJj2bZj literal 0 HcmV?d00001 From 2db3acf5e0d10f5bad0654718b08ec2ac959d740 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 16 Apr 2023 11:18:05 +0930 Subject: [PATCH 18/33] Update build script to copy over assets --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0634444d..43ce2f05 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "dist/server.js", "scripts": { "dev": "yarn build; nodemon src/server.js", - "build": "rm -rf dist && tsc", + "build": "rm -rf dist && tsc && rm -rf dist/assets && cp -R assets dist/", "prestart": "yarn build", "start": "node dist/server.js", "tests": "ts-mocha './tests/**/*.ts'", From 0fd95f20f876208a7f04edb8ec73942bd793cab2 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 16 Apr 2023 11:18:30 +0930 Subject: [PATCH 19/33] Dont mint SBTs from the server --- tests/vcsbt.tests.ts | 100 ------------------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 tests/vcsbt.tests.ts diff --git a/tests/vcsbt.tests.ts b/tests/vcsbt.tests.ts deleted file mode 100644 index aa679f8e..00000000 --- a/tests/vcsbt.tests.ts +++ /dev/null @@ -1,100 +0,0 @@ -import Axios from 'axios' -const assert = require("assert") -import serverconfig from '../src/serverconfig.json' -import Providers from '../src/providers' -import CommonUtils from './common.utils' -import { Credentials, SharingCredential } from '@verida/verifiable-credentials' -import { DatabasePermissionOptionsEnum } from '@verida/types' -import { buildVeridaUri, fetchVeridaUri } from '@verida/helpers' - -const SCHEMA_FOLLOWING = 'https://common.schemas.verida.io/social/following/v0.1.0/schema.json' -const SCHEMA_SBT = 'https://common.schemas.verida.io/token/sbt/storage/v0.1.0/schema.json' -const MINT_ADDRESS = '0x2cEf1aF8510C158008fD69Ef233Bfff732E5C30A' - -const log4js = require("log4js") -const logger = log4js.getLogger() -logger.level = serverconfig.logLevel - -const providerName = 'twitter' -const providerConfig = serverconfig.providers[providerName] -const creds = providerConfig.testing - -let connection, followingDatastore, encryptionKey, credentialRecord - -// NEXT steps: -// 1. Make VC creation optional -// 2. Cant Mint SBT -// 3. Test if new Twitter passport has fixed issue on my phone - -describe(`${providerName} Tests`, function() { - this.timeout(100000) - - describe("VC and SBT tests", () => { - //let syncResult - const provider = Providers(providerName) - - before(async () => { - const provider = Providers(providerName) - connection = await CommonUtils.getNetwork() - // Open the "following" datastore - followingDatastore = await connection.context.openDatastore( - SCHEMA_FOLLOWING - ) - - const info = await (await followingDatastore.getDb()).info() - encryptionKey = Buffer.from(info.encryptionKey).toString('hex') - await CommonUtils.closeDatastore(followingDatastore) - }) - - it('can sync and obtain a VC', async() => { - const syncRequestResult = await CommonUtils.syncConnector(providerName, creds.accessToken, creds.refreshToken, connection.did, encryptionKey) - const { source, status, syncInfo } = await CommonUtils.getSyncResult(connection, syncRequestResult, encryptionKey) - - assert.ok(status != 'error', `Sync error: ${syncInfo.error}`) - - const credentials = new Credentials() - credentialRecord = syncInfo.profile.credential - const verifiedCredential = await credentials.verifyCredential(credentialRecord.didJwtVc) - assert.ok(verifiedCredential, 'Have a verified credential') - - console.log(verifiedCredential) - - //assert.equal(verifiedCredential.payload.iss, connection.did, 'Correct DID') - }) - - it('can generate a valid SBT', async () => { - // Save the credentialRecord to public credential db - const datastore = await connection.context.openDatastore(SCHEMA_SBT, { - permissions: { - read: DatabasePermissionOptionsEnum.PUBLIC, - write: DatabasePermissionOptionsEnum.OWNER - } - }); - - const sbtData = { - ...credentialRecord.credentialData, - didJwtVc: credentialRecord.didJwtVc - } - - const result = await datastore.save(sbtData) - console.log(result) - assert.ok(result, 'Saved credential record') - - const db = await datastore.getDb() - const info = await db.info() - const uri = buildVeridaUri(connection.did, connection.context.getContextName(), info.databaseName, result.id, {}) - console.log(uri) - await CommonUtils.mintSBT(uri, MINT_ADDRESS) - - // close database - }) - - // try to mint the same SBT again which will fail - - // revoke SBT - - after(async () => { - // Delete SBT? - }) - }) -}) \ No newline at end of file From 011e24304b27b5c765b5bb53c6395286c07e0e31 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 16 Apr 2023 11:19:30 +0930 Subject: [PATCH 20/33] Serve static assets folder --- src/server-app.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/server-app.ts b/src/server-app.ts index 4a36bb09..22350778 100644 --- a/src/server-app.ts +++ b/src/server-app.ts @@ -10,6 +10,8 @@ const logger = log4js.getLogger() import CONFIG from "./config" logger.level = CONFIG.logLevel +const path = require('path') + //const basicAuth = require('express-basic-auth') //import RequestValidator from './request-validator' @@ -17,6 +19,8 @@ logger.level = CONFIG.logLevel const app = express(); //const validator = new RequestValidator() +console.log(path.join(__dirname, 'assets')) +app.use('/assets', express.static(path.join(__dirname, 'assets'))) app.use(session({ secret: 'c20n498n720489t729amx9 8es', resave: false, @@ -42,7 +46,7 @@ app.use(router) module.exports=app /* -//Example code to create HTTPS server +//Example code to create HTTPS server (for facebook testing) const https = require("https") const fs = require("fs") From 2c7824ddaa4062db152ca5cb83f09b79eb48b221 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 16 Apr 2023 11:21:16 +0930 Subject: [PATCH 21/33] Cleanup discord provider --- src/providers/BaseProvider.ts | 8 +-- src/providers/discord/index.ts | 13 ++--- src/providers/discord/sbts.ts | 92 ++++++++++++++++++++++++++++++++++ src/utils.ts | 6 +-- 4 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 src/providers/discord/sbts.ts diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index f15469f5..da074143 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -68,11 +68,11 @@ export default class BaseProvider { const credentialData: Record = { did, - didAddress, + didAddress: didAddress.toLowerCase(), name: `${this.getProviderLabel()}: ${profileLabel}`, type: `${this.getProviderId()}-account`, image: this.getProviderImageUrl(), - description: `Proof ${did} controls ${this.getProviderLabel()} account ${profileLabel}${profileLabel == this.profile.id ? '' : '(' + this.profile.id+ ')'}`, + description: `Proof of ${this.getProviderLabel()} account ownership ${profileLabel}${profileLabel == this.profile.id ? '' : ' (' + this.profile.id+ ')'}`, attributes: [{ trait_type: "accountCreated", value: this.profile.createdAt @@ -96,8 +96,8 @@ export default class BaseProvider { public async getProfile(did: string, context: Context): Promise { if (this.profile && !this.profile.credential) { - const credentialData = await this.getProfileData(did) - this.profile.credential = await Utils.buildCredential(credentialData, context) + const profileCredentialData = await this.getProfileData(did) + this.profile.credential = await Utils.buildCredential(profileCredentialData, context) } return this.profile diff --git a/src/providers/discord/index.ts b/src/providers/discord/index.ts index 0958aaf2..7c7e5a83 100644 --- a/src/providers/discord/index.ts +++ b/src/providers/discord/index.ts @@ -9,8 +9,7 @@ import { DiscordSnowflake } from '@sapphire/snowflake' import dayjs from 'dayjs' import axios from 'axios' -//import Following from './following' -//import Posts from './posts' +import SBTs from './sbts' import TokenExpiredError from '../TokenExpiredError' export interface DiscordProviderConfig extends BaseProviderConfig { @@ -21,7 +20,7 @@ export interface DiscordProviderConfig extends BaseProviderConfig { } // Note: If scopes change a user needs to disconnect and reconnect the app -const SCOPE = [Scope.IDENTIFY, Scope.EMAIL, Scope.GUILDS, Scope.GUILDS_JOIN] +const SCOPE = [Scope.IDENTIFY, Scope.EMAIL, Scope.GUILDS, 'guilds.members.read'] export default class DiscordProvider extends Base { @@ -36,15 +35,13 @@ export default class DiscordProvider extends Base { } public syncHandlers(): any[] { - /*return [ - Following, - Posts - ]*/ + return [ + //SBTs + ] return [] } public async connect(req: Request, res: Response, next: any): Promise { - console.log('connect') this.init() const auth = await passport.authenticate(this.getProviderId()) return auth(req, res, next) diff --git a/src/providers/discord/sbts.ts b/src/providers/discord/sbts.ts new file mode 100644 index 00000000..5fa23cd5 --- /dev/null +++ b/src/providers/discord/sbts.ts @@ -0,0 +1,92 @@ +import BaseSyncHandler from "../BaseSyncHandler" +import { SyncSchemaConfig } from "../BaseProvider" +import { REST } from 'discord.js' +import DiscordProvider from "." +const _ = require('lodash') + +// import dayjs from 'dayjs' +//const log4js = require("log4js") +//const logger = log4js.getLogger() + +export default class SBTs extends BaseSyncHandler { + protected static schemaUri: string = 'https://common.schemas.verida.io/credential/base/v0.2.0/schema.json' + + /** + * @todo: Support paging through all results + * @todo: Correctly support `this.config.limitResults` + * + * @param api + */ + public async sync(api: REST, syncConfig: SyncSchemaConfig = {}): Promise { + console.log('fetching sbt credentials to sync') + + const guildResponse: any = await api.get('/users/@me/guilds') + + //const genericApi = new REST({ version: '10', authPrefix: 'Bearer' }).setToken(provider.getConfig()); + + const guilds = {} + return guilds + for (let i in guildResponse) { + try { + const guildItem = guildResponse[i] + console.log('fetching member guild info for ', guildItem.name) + const guildMemberInfo = await api.get(`/users/@me/guilds/${guildItem.id}/member`) + console.log('fetching guild info for ', guildItem.name) + const guildInfo = await api.get(`/guilds/${guildItem.id}`) + console.log(guildItem, guildMemberInfo, guildInfo) + } catch (err) { + console.log(err) + } + } + + return guilds + /*console.log('following.sync()') + console.log(syncConfig) + const me = await api.v2.me() + const limit = syncConfig.limit ? syncConfig.limit : this.config.followingLimit + const sinceId = syncConfig.sinceId ? syncConfig.sinceId.substring(8) : undefined + console.log('limit', limit) + console.log('sinceId', sinceId) + + const followingResult = await api.v2.following(me.data.id, { + 'user.fields': ['profile_image_url', 'description'], + asPaginator: true + }) + + const results = [] + const now = (new Date()).toISOString() + for await (const user of followingResult) { + if (sinceId && user.id == sinceId) { + console.log('latest user id found, exiting') + break + } + + // Iterate until rate limit is hit + // or API calls returns no more results + + //console.log(user) + + results.push({ + _id: `twitter-${user.id}`, + name: user.name, + icon: user.profile_image_url, + summary: user.description.substring(0,256), + uri: `https://twitter.com/${user.username}`, + sourceApplication: 'https://twitter.com/', + sourceId: user.id, + // twitter doesn't support a timestamp on when the user + // was followed, so set to current timestamp + followedTimestamp: now, + insertedAt: now + }) + + if (results.length >= limit) { + break + } + } + + console.log('returning following results:', results.length) + return results*/ + } + +} \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts index 660d7add..0c997a05 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -10,8 +10,6 @@ const CONTEXT_NAME = serverconfig.verida.contextName const PRIVATE_KEY = serverconfig.verida.privateKey const DEFAULT_ENDPOINTS = serverconfig.verida.defaultEndpoints const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig -const VERIDA_URI_WRAPPER = serverconfig.verida.veridaUriWrapper -const WHITELIST_SBT_ISSUERS = serverconfig.verida.whitelistSbtIssuers const SBT_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/token/sbt/credential/v0.1.0/schema.json' @@ -20,9 +18,7 @@ export { PRIVATE_KEY, DEFAULT_ENDPOINTS, DID_CLIENT_CONFIG, - SBT_CREDENTIAL_SCHEMA, - VERIDA_URI_WRAPPER, - WHITELIST_SBT_ISSUERS + SBT_CREDENTIAL_SCHEMA } export class Utils { From a4d20f2f92375f2b802ea38d7216b8fa7fd90075 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 16 Apr 2023 11:30:07 +0930 Subject: [PATCH 22/33] Add providers endpoint for info on all providers --- src/controller.ts | 26 ++++++++++++++++++++++++++ src/routes.ts | 1 + 2 files changed, 27 insertions(+) diff --git a/src/controller.ts b/src/controller.ts index 461fa413..64ad3eb2 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -2,6 +2,7 @@ import { Request, Response } from 'express' import { DatabasePermissionOptionsEnum } from '@verida/types' import EncryptionUtils from '@verida/encryption-utils' import serverconfig from '../src/serverconfig.json' +import CONFIG from './config' const CONTEXT_NAME = serverconfig.verida.contextName @@ -323,12 +324,16 @@ export default class Controller { syncRequest.status = "complete" await syncRequestDatastore.save(syncRequest) + console.log('sync request saved') + await delay(3000) await context.close({ clearLocal: true }) + console.log('context closed') + return } @@ -385,4 +390,25 @@ export default class Controller { }) } + public static async providers(req: Request, res: Response) { + const providers = Object.keys(CONFIG.providers) + + const results: any = {} + for (let p in providers) { + const providerName = providers[p] + try { + const provider = Providers(providerName) + results[providerName] = { + name: providerName, + label: provider.getProviderLabel(), + icon: provider.getProviderImageUrl() + } + } catch (err) { + // skip broken providers + } + } + + return res.send(results) + } + } \ No newline at end of file diff --git a/src/routes.ts b/src/routes.ts index 394404ff..6981d74e 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -8,5 +8,6 @@ router.get('/callback/:provider', Controller.callback) router.get('/sync/:provider', Controller.sync) router.post('/syncStart/:provider', Controller.syncStart) router.get('/syncDone/:provider', Controller.syncDone) +router.get('/providers', Controller.providers) export default router \ No newline at end of file From e131e750ace5a7c8e8e168a719be4cccccbbb5c5 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 17 Apr 2023 09:51:50 +0930 Subject: [PATCH 23/33] Add missing provider icons --- assets/discord/icon.png | Bin 21731 -> 1231 bytes assets/github/icon.png | Bin 0 -> 1301 bytes assets/linkedin/icon.png | Bin 0 -> 1136 bytes assets/telegram/icon.png | Bin 0 -> 2557 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/github/icon.png create mode 100644 assets/linkedin/icon.png create mode 100644 assets/telegram/icon.png diff --git a/assets/discord/icon.png b/assets/discord/icon.png index 9af6b8a7b11599cb60ed5018d3953690f00b2f40..359d3c23371c0d6b21ca382e05efcefad2d681d9 100644 GIT binary patch delta 1227 zcmV;+1T_2OsR7RkA&F2Z& zb5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj9WJyFpRCoc^nNMs?K^(__Z@ZRmBWchZ z@p>U#tZ?DLN*y#IAzYlSi-dzesRN?XaBvcF6PH#m;!jTm7wJ}lgJK=jpUbXrYq27` zwB2_6zVA=_b~`igb^o@XWcIy%Z-3s*_x)z(_nVn#P=yE~Vtj~m+QbRxt(;6xmMo`~ za~$H7Gz=p}^@fF-oGx+tCCVessTbu?t#QN-it5r^6Y*SVtFSFwOD<8h5Vm#GqCTWW zrB>$x;-dV1TP~Aj zO~t{X(PYRLo^>yTy?2G}c1#M$=#Oa{P8I0uw`t1d1$CWh*5)60I8GVPyEPW3jq94I zZB>W@U~)RmsmHxwcm(5S+OLE>i+l2Hf<``1(a4vnqI(b>jq=NkiJ5CH{688s_-N3% z%lV@GYgdP;b9W@@3$(l4#D6Qgmk$ZuQ^W5Hbo2H<%c|9;yDLf?*Ei|1V9v4&C)VpZ zR!-=ifQ9?-*G4e7+4s+?LqpurNp73?hEQ|~Z?jh$jE~1$hYtz-xT52J1wMG_TVTaJ zc{b^1?Nj&(341T(X$K`?+|A8TXc7K5eZdUWQjLt+oyktwW zVYyLd-5l-}!N%0aPJe`I6|lmrV4Jp;A=)D-H@ z_DU;~`ShVz7@)->;7WD#n0#J&D}@gDo)jL$Z*tUscia-cWq)(nYL)(b<5KT|JXfy$ z<$=rIW0gT4d8{Ca=+IdDx4~f%6YT4kT3jSU&Ss#rU+Y{_ ztx*J)4D`A#?}jV~mP0Dwd%Mp@9UmP09Fb>qPGwagY?# zRCf^|n=io9#}mtFKEUh9LO9Agv^Sz!McSo*;Wwx!kl!zL*fN-+xYua{2J7V3mQg0?^~tX_Sb@ zj1OC4CM_J`G1|QsirT~3dcxj9mKFxCo+9RSBB$RRpoPIvX+KuMT_qtJOM=Ql*!$Ft z_!1DON)U_fn@frKK<=;tP=56{@`Y{nK2co;MIAqaLVQ}32l{PKxne7xdy3g_8_d{|6bwvRjLzz3u=2002ovPDHLkV1gfhR+|6- literal 21731 zcmY(q1yGwo*EXDl;O_43T3mutin|qe*WwTyinh2rl;SPL-L1G5TA;YQOFsHOul)Z# zbI+dLTt_xL$)4GBZH$_VJUR*q3IG5=f2$y)0RRABMIZnP;k7Yx|6={G=b<4l1*n-I z+kfqZTj{;ER#pbEyvj%bcpwe{?jPiz8ju74|6eiypa>-WUs(gl^xqf|01#yd0RK0} z;I;ktD7?P^oc^bUD**nV#RAa(pn-q_xc`&?sijPLE50_!t_u1d001iPzZVF|${~8S zrf;XE=c%WxBy8d0#9?OXVs6FZXc9{1-y_RsJ{3 zNkjEt5Kjj&8a-t-DrpyYD=K~tE)FglaTF>lDp7Y!Yheu;x&Kyw?TOLYdV0DFb8>on zdvkd6a=5tLaB>R?32}1qaPsi5zarQ@e4RbbeAt~mX#Zp6f9%Lud04pHxq8~UI8*(z zYi91^95Fh(wV#L^ru*UfeOjk@}omj%yA{0;*zi=f9P zPvU)!D4rS)t_#^zwu1S1oE#N`a@-(d^cT?*QmpOy-=4acR{A?`P*4l%@bXeQC@9k@!9`e4djnOe!F*6D-)gcR-6Ade4f-5t z3f&o9j*5tHG>it1urWe{Om89&zba_+Df+Y7#|-i7=$;NcDGt-g%cbRw=%r}|u)KU7 zd2jsE`1?qwE((Eo_Oi7<3*?EN-gRC9>1@0YL1ZAwMyV98-)}>T;X{jLF<$I|Nlry@ zbC;8Z9({848X?@)S;feCkFe+4I3OM1u@j zvw9ANFc}p>)a!O7oKIA5^>T>@CG0^R$9yL7%DGaFbNH4>UqKhN!|5BSRHV)D_ih*X zHjN)P-_>r6=(?U-Z@HIy&Ud!%#>#o;lc7l^i{I{3+Lc55sO*BPgUmufiq(XgKYYfJ za{erw+?}4<@r~J+twf4Z`iNk%+$tI6If5%I`PmSh_ zlNn#iyIpZE|2kr!M0P3RSjBjLD2#hl8+00e;f-{1tn*7aS$$k)o}*d?-+x1!)TA{4 zQ&;?eOXMP6-u>vtqmj|>$1J?{4cKjBS`c%htXzpPSwA2^X)_Vo`b1q^<=)yl+L(PH z0(2QD?9+4_6q(wwV4d?TQiBL-5q8T6^vZ`6v|`T@Bpu~Vsdzf@Z=Cr`|0Oj@k6S6? z@PRF?1ZCEOCD)w8z2Bb>$%IH*RdM4B^I{fn8*Ki#>InR^e@k9-$Q|d~eG7kgQo8

;^{u3h4^TqmRZfZlw{Jt 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 O`czZWRxFXX3I8AJj2bZj diff --git a/assets/github/icon.png b/assets/github/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cb0a192a8d812861e50da5bc75cf1dc8c07ecab4 GIT binary patch literal 1301 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 Date: Wed, 26 Apr 2023 12:42:43 +0930 Subject: [PATCH 24/33] Update icons --- assets/discord/icon.png | Bin 1231 -> 3848 bytes assets/facebook/icon.png | Bin 20543 -> 1725 bytes assets/github/icon.png | Bin 1301 -> 4710 bytes assets/linkedin/icon.png | Bin 1136 -> 2316 bytes assets/twitter/icon.png | Bin 21731 -> 3386 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/discord/icon.png b/assets/discord/icon.png index 359d3c23371c0d6b21ca382e05efcefad2d681d9..379ce45dc26a8358a5c3fc36cb5d1d6eada054fb 100644 GIT binary patch literal 3848 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 delta 1197 zcmV;e1XBBm9?uCOiBL{Q4GJ0x0000DNk~Le0000j0000j2nGNE06H4tnvo$ie*|Pn zL_t(|0o9pLY)nBM$A53TmTn_y&>Qi3AzZ9*;lN5AG$A2eoUDt4gFmSQqS0`05^)ok zRxjdDPXrg~R)T|K9n_!8u5fFyBD=KRcKp8YPy2Q|Gw*f(wx4A7y?t-q%=i6f=J%VK zXHbO*A!2-pbK1lS=dGMfPnImFf0T0^;*>NDBSrOwg_@i$ar!07Bh9H77M^u4guQo#?RHEG$mox0e;Q5|= z%H;)hooLqPA9y%U8P2;k7N(8sny776hyq}8I?buayp50V=$?Ru`|sCAFu2+G&#FU1+|fyHoA`!MbO~>> zR~w9v$6SXG3H-RC<9-D`c<5VT#XNa7>1XXz_z4MnK5Xi84%9&~fM6eMW8xNrrQ_to z$d>}uivZS+L-bBvj-i*6HSNo#K=9D3NnMsr5UmZ@&tGZ_s0nbbe;Q(lh%wb&yme^+ zDP;o(hMn7&a8#V4;r9h)t01`S>4;FCAV%;Dh^?(xH73 z=id^JZqs!BN?z*AuU?GKL_NG@OS56QQDxm6?iInt)W%MPY89};tYDkAl_A=(Ej%ah z4i;G&rtxfx+>#c8C=Kh%RCqBE+SV`FO3xxey4 z$0U`hT-fMOwJ-!U1zCvBDj(Do>dy8`E0X#2p;s87#UkKJb@P~fUU@5p4)~rF9>i~Q z)PHx}62E10*lLyjd*f2?fjn2P{pEqn-eZ+PA9<`Gi0IH*fBLt$1CtkNu%W za_81^+2u3n9!XkUBty<-ptN7>TvDx31eOf+x-RdAEC-fDD&Tv&&qf^|9Q@^Ah|UiC z*{!j#G9Q*;5|a3_YSXO`F^_)AUP3k~5lk?+5aAGd5z65uG9Ld9k+7P%CPZu3G+AQc zIR+ld2QBg=f70T`Bv|W2?;3HC6w_395g?l{z|zMP%V<8p>&QYl$~v?+qFUtkvEZXP znb&IE75|2}4Pbd#y1T16=vKfCaDgW;55*AsS19%0bxs)Q$KO5T{BIi|w0BiTFV7umVti^*8c`ZS_7;T?R!R zKY~JhT9gO+ZBMykE1r9b*>B_6sY3I*-^X1tH2ZxVtE7s*jsFK3#Ijq9qrL6`0000< LMNUMn143YeR}@WP diff --git a/assets/facebook/icon.png b/assets/facebook/icon.png index 607df92dfec9907822c4c746c9cf41d70c3fea3c..53b93ee7a11f6b302f0a08d70ee7d1b9f1306d2a 100644 GIT binary patch literal 1725 zcmd5-`BPJ86umDz0|*Eu%A%6ssOU&&z%61L4T1(rL6p7X5Je0w#A+s@DDyHRAks=( zgpsHirmYwkjJTi(O;YVdOaW0q0|c-r1TjDW*^}3of1%Tv`osOsJ?EYu&zvteBAn|m zd;V+ya0m$w+75saD*`rT0uqi~+e?7$cfs*O06U6h5RhDQvsi@NxtpN8eqkR$P<}vI z0KlDmyO~|H0La@zf&!wBAqL%@L($QoHU{pHic)6i)r$hl|VQR_b%#7gD%t&0Cr4 zMjGn~ufNwSIel2UfHtD9-5VdTYd24t2N{Y(2Tg5xoof=uX@Y|oAF~0xFSDES{+-ci zxc#X34(_3U+>Ca0JW*uI=biC#${&M-e_2-0#vdwO1dD#}kPIZQ%ebbzf%3W}`^?P^We*s=s(zHGlu$Ah zCD`lpSC~hEjA%eLDLwZ)Qnh7OTO|wp z_!J+QdUZ>sh|#+u`ciFi`c=HH)tq-FM)UV@dMSoVb9&CT_*tcp@nTK>E#ry5l9g0R z$@L@?W^9ejRP+*t{p+lUMhy3F6=bx`WGn-A)RSfSNz4>qilb8g{tIR%7mLJqIf+aB z6I7q@M8U-=$1L!z=*gyK2Y_3yY9pPb48Cc~*$i&AnzT=T_5_too89Liyd~Z@NWM${ zZP2wI#~d@JYxfji-d8DmHC^rZY%((Expp%1H}6Astc)6seu1 zA`<6*Ow254DuHyQbs0p-v{`S$pIUtH^qmff^lQ=!%d0Rgf}Ku;=+Y&yf#?cUpA8Wn zu~4-bqSTEF7KtNTXnJfR_EHO}w!LP7llF0GsQAM}Yl|37uu4>XeZoyHu!ZQuv!pu+ zF#*vRLBu?oRf`WIT~P$O3T79z>X;$K|EuPKp38MO-u*~ckyzdy=WUnP+IG7kRY@d_ z-Sp?un@QZUw3iPics1=+{p(E;aiq_vUH+@i3!9ss{JwUtzi{%fmXW7fkoA_x#i<(qh?{sDI7e1-r3 literal 20543 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 delta 1267 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 T*7nO300000NkvXXu0mjf^p_Ii diff --git a/assets/twitter/icon.png b/assets/twitter/icon.png index 9af6b8a7b11599cb60ed5018d3953690f00b2f40..cb8f5bab12565c19a99b0ca0853f05986e4c44cc 100644 GIT binary patch literal 3386 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 literal 21731 zcmY(q1yGwo*EXDl;O_43T3mutin|qe*WwTyinh2rl;SPL-L1G5TA;YQOFsHOul)Z# zbI+dLTt_xL$)4GBZH$_VJUR*q3IG5=f2$y)0RRABMIZnP;k7Yx|6={G=b<4l1*n-I z+kfqZTj{;ER#pbEyvj%bcpwe{?jPiz8ju74|6eiypa>-WUs(gl^xqf|01#yd0RK0} z;I;ktD7?P^oc^bUD**nV#RAa(pn-q_xc`&?sijPLE50_!t_u1d001iPzZVF|${~8S zrf;XE=c%WxBy8d0#9?OXVs6FZXc9{1-y_RsJ{3 zNkjEt5Kjj&8a-t-DrpyYD=K~tE)FglaTF>lDp7Y!Yheu;x&Kyw?TOLYdV0DFb8>on zdvkd6a=5tLaB>R?32}1qaPsi5zarQ@e4RbbeAt~mX#Zp6f9%Lud04pHxq8~UI8*(z zYi91^95Fh(wV#L^ru*UfeOjk@}omj%yA{0;*zi=f9P zPvU)!D4rS)t_#^zwu1S1oE#N`a@-(d^cT?*QmpOy-=4acR{A?`P*4l%@bXeQC@9k@!9`e4djnOe!F*6D-)gcR-6Ade4f-5t z3f&o9j*5tHG>it1urWe{Om89&zba_+Df+Y7#|-i7=$;NcDGt-g%cbRw=%r}|u)KU7 zd2jsE`1?qwE((Eo_Oi7<3*?EN-gRC9>1@0YL1ZAwMyV98-)}>T;X{jLF<$I|Nlry@ zbC;8Z9({848X?@)S;feCkFe+4I3OM1u@j zvw9ANFc}p>)a!O7oKIA5^>T>@CG0^R$9yL7%DGaFbNH4>UqKhN!|5BSRHV)D_ih*X zHjN)P-_>r6=(?U-Z@HIy&Ud!%#>#o;lc7l^i{I{3+Lc55sO*BPgUmufiq(XgKYYfJ za{erw+?}4<@r~J+twf4Z`iNk%+$tI6If5%I`PmSh_ zlNn#iyIpZE|2kr!M0P3RSjBjLD2#hl8+00e;f-{1tn*7aS$$k)o}*d?-+x1!)TA{4 zQ&;?eOXMP6-u>vtqmj|>$1J?{4cKjBS`c%htXzpPSwA2^X)_Vo`b1q^<=)yl+L(PH z0(2QD?9+4_6q(wwV4d?TQiBL-5q8T6^vZ`6v|`T@Bpu~Vsdzf@Z=Cr`|0Oj@k6S6? z@PRF?1ZCEOCD)w8z2Bb>$%IH*RdM4B^I{fn8*Ki#>InR^e@k9-$Q|d~eG7kgQo8

;^{u3h4^TqmRZfZlw{Jt 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 O`czZWRxFXX3I8AJj2bZj From c2803171ab22cdeb0eb308d8a9df77b114ca8b34 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 28 Apr 2023 17:07:35 +0930 Subject: [PATCH 25/33] Fix image handling --- src/providers/BaseProvider.ts | 12 +++++------- src/providers/BaseProviderConfig.ts | 1 + src/utils.ts | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index da074143..e79311ef 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -28,14 +28,12 @@ export interface SyncSchemaConfig { export default class BaseProvider { - protected icon?: string protected config: BaseProviderConfig protected newAuth?: AccountAuth protected profile?: AccountProfile public constructor(config: BaseProviderConfig) { this.config = config - this.icon = `${serverconfig.assetsUrl}/${this.getProviderId()}/icon.png` } public getProviderId(): string { @@ -43,15 +41,15 @@ export default class BaseProvider { } public getProviderImageUrl(): string { - return this.icon + return `${serverconfig.assetsUrl}/${this.getProviderId()}/icon.png` } public getProviderLabel(): string { - throw new Error('Not implemented') + return this.config.label } - public getLabel() { - return this.config.label + public getProviderSbtImage(): string { + return this.config.sbtImage } public async connect(req: Request, res: Response, next: any): Promise { @@ -71,7 +69,7 @@ export default class BaseProvider { didAddress: didAddress.toLowerCase(), name: `${this.getProviderLabel()}: ${profileLabel}`, type: `${this.getProviderId()}-account`, - image: this.getProviderImageUrl(), + image: this.getProviderSbtImage(), description: `Proof of ${this.getProviderLabel()} account ownership ${profileLabel}${profileLabel == this.profile.id ? '' : ' (' + this.profile.id+ ')'}`, attributes: [{ trait_type: "accountCreated", diff --git a/src/providers/BaseProviderConfig.ts b/src/providers/BaseProviderConfig.ts index 9e655f2b..f60f467c 100644 --- a/src/providers/BaseProviderConfig.ts +++ b/src/providers/BaseProviderConfig.ts @@ -1,5 +1,6 @@ export default interface BaseProviderConfig { + sbtImage: string label: string signerPrivateKey: string } \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts index 0c997a05..36370548 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -73,7 +73,7 @@ export class Utils { const provider = Providers(providerName) providerList.push({ name: providerName, - label: provider.getLabel(), + label: provider.getProviderLabel(), icon: provider.icon ? provider.icon : `${serverconfig.assetsUrl}/${providerName}/icon.png` }) } From 5c78d98b2e51734f22da5faf09f94cfa8f58ba91 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 28 Apr 2023 17:13:13 +0930 Subject: [PATCH 26/33] Update dependencies --- package.json | 12 +- src/config.ts | 2 +- src/controller.ts | 17 +- src/request-validator.ts | 7 +- yarn.lock | 780 +++++++++++++++++++++++++++++++++------ 5 files changed, 682 insertions(+), 136 deletions(-) diff --git a/package.json b/package.json index 4543d8b7..373e4ed6 100644 --- a/package.json +++ b/package.json @@ -26,11 +26,12 @@ }, "homepage": "https://github.com/verida/server-template#readme", "dependencies": { - "@verida/account-node": "^2.0.0", - "@verida/client-ts": "^2.0.1", - "@verida/did-client": "^2.0.0", - "@verida/encryption-utils": "^2.0.0", - "@verida/web3": "^2.0.0", + "@verida/account-node": "^2.3.4", + "@verida/client-ts": "^2.3.4", + "@verida/did-client": "^2.3.4", + "@verida/encryption-utils": "^2.2.1", + "@verida/types": "^2.3.1", + "@verida/web3": "^2.3.4", "aws-serverless-express": "^3.4.0", "axios": "^1.2.3", "body-parser": "^1.19.0", @@ -56,7 +57,6 @@ "@types/express": "^4.17.13", "@types/express-session": "1.17.0", "@types/mocha": "^9.1.0", - "@types/pouchdb-core": "^7.0.10", "claudia": "^5.14.1", "nodemon": "^2.0.14", "typescript": "4.6.3" diff --git a/src/config.ts b/src/config.ts index cfeac93b..87574f98 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,4 @@ -import { EnvironmentType } from '@verida/client-ts' +import { EnvironmentType } from '@verida/types' import serverconfig from './serverconfig.json' export default serverconfig diff --git a/src/controller.ts b/src/controller.ts index d1651882..d4b5f556 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -1,6 +1,6 @@ import { Request, Response } from 'express' -import { Client, ContextInterfaces } from '@verida/client-ts' +import { Client } from '@verida/client-ts' import { AutoAccount } from '@verida/account-node' import EncryptionUtils from '@verida/encryption-utils' import fs from 'fs' @@ -23,6 +23,7 @@ const DATA_SYNC_REQUEST_SCHEMA = 'https://vault.schemas.verida.io/data-connectio import Providers from "./providers" import TokenExpiredError from './providers/TokenExpiredError' +import { DatabasePermissionOptionsEnum } from '@verida/types' const delay = async (ms: number) => { await new Promise((resolve) => setTimeout(() => resolve(true), ms)) @@ -144,8 +145,8 @@ export default class Controller { const syncRequestDatabaseName = EncryptionUtils.hash(`${did}-${DATA_SYNC_REQUEST_SCHEMA}`) const syncRequestDatastore = await context.openDatastore(DATA_SYNC_REQUEST_SCHEMA, { permissions: { - read: ContextInterfaces.PermissionOptionsEnum.USERS, - write: ContextInterfaces.PermissionOptionsEnum.USERS, + read: DatabasePermissionOptionsEnum.USERS, + write: DatabasePermissionOptionsEnum.USERS, readList: [did], writeList: [did] }, @@ -218,8 +219,8 @@ export default class Controller { // open a datastore where the user has permission to access the datastores const datastore = await context.openDatastore(schemaUri, { permissions: { - read: ContextInterfaces.PermissionOptionsEnum.USERS, - write: ContextInterfaces.PermissionOptionsEnum.USERS, + read: DatabasePermissionOptionsEnum.USERS, + write: DatabasePermissionOptionsEnum.USERS, readList: [did], writeList: [did] }, @@ -374,8 +375,8 @@ export default class Controller { const databaseName = EncryptionUtils.hash(`${did}-${schemaUri}`) const datastore = await context.openDatastore(schemaUri, { permissions: { - read: ContextInterfaces.PermissionOptionsEnum.USERS, - write: ContextInterfaces.PermissionOptionsEnum.USERS, + read: DatabasePermissionOptionsEnum.USERS, + write: DatabasePermissionOptionsEnum.USERS, readList: [did], writeList: [did] }, @@ -407,7 +408,7 @@ export default class Controller { const network = new Client({ environment: VERIDA_ENVIRONMENT }) - const account = new AutoAccount(DEFAULT_ENDPOINTS, { + const account = new AutoAccount({ privateKey: PRIVATE_KEY, environment: VERIDA_ENVIRONMENT, // @ts-ignore diff --git a/src/request-validator.ts b/src/request-validator.ts index 391983f9..32aae4c7 100644 --- a/src/request-validator.ts +++ b/src/request-validator.ts @@ -1,7 +1,10 @@ const basicAuth = require('express-basic-auth') const mcache = require("memory-cache") import { DIDClient } from '@verida/did-client' -import { sign } from 'crypto' +import serverconfig from '../src/serverconfig.json' +import {strToEnvType} from "./config" + +const VERIDA_ENVIRONMENT = strToEnvType(serverconfig.verida.environment) let didClient: DIDClient @@ -35,7 +38,7 @@ export default class RequestValidator { if (!didDocument) { if (!didClient) { didClient = new DIDClient({ - network: 'testnet' + network: VERIDA_ENVIRONMENT }) } diff --git a/yarn.lock b/yarn.lock index 817be3d1..048d165a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,22 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" + integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== + dependencies: + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -27,7 +42,20 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@5.5.1": + version "5.5.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" + integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/networks" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/web" "^5.5.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.5.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -40,7 +68,18 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" + integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== + dependencies: + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -51,7 +90,18 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" + integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.5.0", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -62,14 +112,29 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" + integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.5.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" + integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.5.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -77,7 +142,16 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" + integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + bn.js "^4.11.9" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -86,20 +160,50 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" + integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" + integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" +"@ethersproject/contracts@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" + integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== + dependencies: + "@ethersproject/abi" "^5.5.0" + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/contracts@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" @@ -116,7 +220,21 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" + integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.5.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -131,7 +249,25 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": +"@ethersproject/hdnode@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" + integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/basex" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/pbkdf2" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/wordlists" "^5.5.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.5.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== @@ -149,7 +285,26 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": +"@ethersproject/json-wallets@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" + integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ== + dependencies: + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/hdnode" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/pbkdf2" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/random" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.5.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== @@ -168,7 +323,15 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" + integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + js-sha3 "0.8.0" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -176,19 +339,39 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" + integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.0.tgz#babec47cab892c51f8dd652ce7f2e3e14283981a" + integrity sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.5.0", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": +"@ethersproject/pbkdf2@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" + integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.5.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== @@ -196,13 +379,45 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" + integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== + dependencies: + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/providers@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.0.tgz#bc2876a8fe5e0053ed9828b1f3767ae46e43758b" + integrity sha512-xqMbDnS/FPy+J/9mBLKddzyLLAQFjrVff5g00efqxPzcAwXiR+SiCGVy6eJ5iAIirBOATjx7QLhDNPGV+AEQsw== + dependencies: + "@ethersproject/abstract-provider" "^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/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/networks" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/random" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/web" "^5.5.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" @@ -229,7 +444,15 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.0.tgz#305ed9e033ca537735365ac12eed88580b0f81f9" + integrity sha512-egGYZwZ/YIFKMHcoBUo8t3a8Hb/TKYX8BCBoLjudVCZh892welR3jOxgOmb48xznc9bTcMm7Tpwc1gHC1PFNFQ== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.5.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -237,7 +460,15 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" + integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -245,7 +476,16 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" + integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + hash.js "1.1.7" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.5.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -254,7 +494,19 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" + integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.5.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -266,6 +518,18 @@ elliptic "6.5.4" hash.js "1.1.7" +"@ethersproject/solidity@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" + integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/sha2" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + "@ethersproject/solidity@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" @@ -278,7 +542,16 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" + integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -287,7 +560,22 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" + integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== + dependencies: + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.5.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -302,6 +590,15 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" +"@ethersproject/units@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" + integrity sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag== + dependencies: + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/constants" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/units@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" @@ -311,6 +608,27 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" +"@ethersproject/wallet@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" + integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== + dependencies: + "@ethersproject/abstract-provider" "^5.5.0" + "@ethersproject/abstract-signer" "^5.5.0" + "@ethersproject/address" "^5.5.0" + "@ethersproject/bignumber" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/hdnode" "^5.5.0" + "@ethersproject/json-wallets" "^5.5.0" + "@ethersproject/keccak256" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/random" "^5.5.0" + "@ethersproject/signing-key" "^5.5.0" + "@ethersproject/transactions" "^5.5.0" + "@ethersproject/wordlists" "^5.5.0" + "@ethersproject/wallet@5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" @@ -332,7 +650,18 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.0.tgz#0e5bb21a2b58fb4960a705bfc6522a6acf461e28" + integrity sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA== + dependencies: + "@ethersproject/base64" "^5.5.0" + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.5.0", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -343,7 +672,18 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": +"@ethersproject/wordlists@5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" + integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q== + dependencies: + "@ethersproject/bytes" "^5.5.0" + "@ethersproject/hash" "^5.5.0" + "@ethersproject/logger" "^5.5.0" + "@ethersproject/properties" "^5.5.0" + "@ethersproject/strings" "^5.5.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.5.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== @@ -471,7 +811,7 @@ resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36" integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== -"@stablelib/x25519@^1.0.1": +"@stablelib/x25519@^1.0.1", "@stablelib/x25519@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd" integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== @@ -586,7 +926,12 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.35.tgz#635b7586086d51fb40de0a2ec9d1014a5283ba4a" integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== -"@types/pouchdb-core@*", "@types/pouchdb-core@^7.0.10": +"@types/node@^18.15.11": + version "18.16.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.2.tgz#2f610ea71034b3971c312192377f8a7178eb57f1" + integrity sha512-GQW/JL/5Fz/0I8RpeBG9lKp0+aNcXEaVL71c0D2Q0QHDTFvlYKT7an0onCUXj85anv7b4/WesqdfchLc0jtsCg== + +"@types/pouchdb-core@*": version "7.0.10" resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.10.tgz#d1ea1549e7fad6cb579f71459b1bc27252e06a5a" integrity sha512-mKhjLlWWXyV3PTTjDhzDV1kc2dolO7VYFa75IoKM/hr8Er9eo8RIbS7mJLfC8r/C3p6ihZu9yZs1PWC1LQ0SOA== @@ -594,6 +939,14 @@ "@types/debug" "*" "@types/pouchdb-find" "*" +"@types/pouchdb-core@^7.0.11": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.11.tgz#8fad7a16889dafab765415430a491eb50a54f564" + integrity sha512-KTKj0Taf8pLTj8eW3qBtCd1Fh+/yhEyVo6/1czTN46MnseobdmnqgXtzaKgHMbuLouh+SHK1vM++aMPaG1qTTA== + dependencies: + "@types/debug" "*" + "@types/pouchdb-find" "*" + "@types/pouchdb-find@*": version "6.3.7" resolved "https://registry.yarnpkg.com/@types/pouchdb-find/-/pouchdb-find-6.3.7.tgz#f713534a53c1a7f3fd8fbbfb74131a1b04711ddc" @@ -637,43 +990,46 @@ binary-case "^1.0.0" type-is "^1.6.16" -"@verida/account-node@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.0.0.tgz#12ed285280cac73aa1ceb41bf651495628b337ae" - integrity sha512-6CDDvF4tje1Bh9p6KSKG6QwlL+rNSSQxEKMnzNHgrtVkUeJIAXW5tQuhk9gI1TVgekMynprjNpEwgdTFWPHcJw== - dependencies: - "@verida/account" "^2.0.0" - "@verida/did-client" "^2.0.0" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" +"@verida/account-node@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.3.4.tgz#ceaabcce30ba0ccdf8f8c43f2a09c837912becc7" + integrity sha512-ydSkkMQ1CseGEiOl+nhauqSvecnvQpSgUwaW1T/29q6ALjuTWb2CZBrDq00+T0nGIU6emIHc2mfnWKwOyw3IDw== + dependencies: + "@verida/account" "^2.3.4" + "@verida/did-client" "^2.3.4" + "@verida/did-document" "^2.3.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.3.1" + "@verida/types" "^2.3.1" axios "^0.27.2" did-resolver "^4.0.1" -"@verida/account@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.0.0.tgz#fc7e853dbfc20e18744f9bb10dad75cc05fbed0a" - integrity sha512-N5WRTUyEYQ113TLMDNMwZNPJcvqeqWCXI1G2tQZz4fR5rg3haLhfnIgqe2bSAsiIT6yTRizWjqwekPi7TCSAkQ== +"@verida/account@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.3.4.tgz#019618a695a4df16e44228aa7d4bbb0b0cce7fa5" + integrity sha512-V9hHoHG6gs9ybsUFsfGyeUiIuS1lDPaErz+Dt5Skxg0wI5Ebiyy+lXAJD+ff6P0TJpWoTtxRWOqvE54O4h4A0A== dependencies: - "@verida/keyring" "^2.0.0" - "@verida/storage-link" "^2.0.0" - did-jwt "5.7.0" + "@verida/keyring" "^2.3.1" + "@verida/storage-link" "^2.3.4" + "@verida/types" "^2.3.1" + did-jwt "^6.11.0" did-resolver "^4.0.1" lodash "^4.17.21" tweetnacl-util "^0.15.1" -"@verida/client-ts@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.0.1.tgz#a64cc733578da849b319c72e726e0710afb44c32" - integrity sha512-ZqFDouGUYszKn4a56pCmnMZehwbH1TPPV5yXbtlAVXjnSqbw06RDlue8HlfbYNiECPAGgQ5KQO+ZFTVwz/UtRA== - dependencies: - "@verida/account" "^2.0.0" - "@verida/account-node" "^2.0.0" - "@verida/did-client" "^2.0.0" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" - "@verida/storage-link" "^2.0.0" +"@verida/client-ts@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.3.4.tgz#a95e3442c471750830b4b7fe48cdc0d29f443833" + integrity sha512-fk5zncegmfW4Bf8nwMh64qmxcr4PRSq9bE3iLk0EmMVIJtVN0tOEyZCIBXlpJmmVAXz/hQ1RwgQC4BdE6MPMyg== + dependencies: + "@verida/account" "^2.3.4" + "@verida/did-client" "^2.3.4" + "@verida/did-document" "^2.3.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.3.1" + "@verida/storage-link" "^2.3.4" + "@verida/types" "^2.3.1" + "@verida/vda-name-client" "^2.3.4" ajv "^8.6.3" ajv-formats "^2.1.1" axios "^0.21.2" @@ -688,93 +1044,145 @@ pouchdb-find "^7.2.2" uuid "^8.3.2" -"@verida/did-client@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.0.0.tgz#1da23e09ecfb1bd3306e96d34f9afcd65c7b8b9d" - integrity sha512-AAPej1qiloOb0mdm7S6SjVNzh19/2k2WIyumMu/LycuZr8nS6POl1VU40bCwovC5sGvW1Y5IE3b9k311JQ0n+A== +"@verida/did-client@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.3.4.tgz#05dd11c2235fc79318f14abc5609d4aec7102a6a" + integrity sha512-9YTYTaJnzEHlkJ6SyXuKTINKNnAokSAW38WSbk+pc4orAteDbcH39PBv+1oC0c36nJeU7iejFg5tAbEmBpScyw== dependencies: - "@verida/did-document" "^2.0.0" - "@verida/vda-did-resolver" "^2.0.0" - "@verida/web3" "^2.0.0" + "@verida/did-document" "^2.3.1" + "@verida/types" "^2.3.1" + "@verida/vda-common" "^2.3.4" + "@verida/vda-did-resolver" "^2.3.4" + "@verida/web3" "^2.3.4" axios "^0.23.0" deepcopy "^2.1.0" + did-resolver "^4.0.1" ethers "^5.5.1" -"@verida/did-document@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.0.0.tgz#b921011579f906e743d953f6ffd96a1f55f3c505" - integrity sha512-9mzbA7PtylehPfAAPor0Gwtkf2+Li0Pv9NbGoT8vqdhNrvOiYTqaz8yhUa/JpqiygolIpo6XC0gUuSqglSpYaw== +"@verida/did-document@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.3.1.tgz#33703386f95b1b54e88af1bf4e763627bea0005e" + integrity sha512-YV53vBnVKn2eNLQB/XkK9j+NmW9pxFV1emwGuDbULlewu1VOwsk2vEqPVWg0mhtkbr2x59xXiewE8LSvE5iwjQ== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" "@ethersproject/transactions" "^5.7.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.3.1" + "@verida/types" "^2.3.1" did-resolver "^4.0.1" - ethers "^5.7.2" lodash "^4.17.21" -"@verida/encryption-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.0.0.tgz#996740206f776d65314dd1351d318b971872bf77" - integrity sha512-w1LY3KJWqmeTWHjKlXGjAnF4ghpeMfXvRe7d1QUoqOLk9p0vgRMGkWwYgqYfhtvkGhu9e5+Nrit9XTGewjbNXg== +"@verida/encryption-utils@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.2.1.tgz#76104228a194187f8019bf97e6b609d6742c67a3" + integrity sha512-0UNlTd9In2JJD8Ov5RXX9t4ta52gtpwJvg00nR4oT8TpMH7B2SEaLzJZqvBK3cRb3Y5IMJxdmjDhiParj9a+zw== dependencies: ethers "^5.5.1" json.sortify "^2.2.2" tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@verida/keyring@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.0.0.tgz#31936030d8cdb78af2affdfe0d1b308af5de69dd" - integrity sha512-CiRDJKVQB4OIeEcc16Kkpx2gnWdWUT+BTnJUHuXB8qUmko/OaDFnV40qogl67sFGyslGptFgmIBkXITHa1MlhA== +"@verida/helpers@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.3.1.tgz#9adbfdbd898b628635550dae67a730c8e67252a9" + integrity sha512-NkELT6fGhF56F4prwzx32HKsaiY0o1RmQh6omT4TkRfoPEf6ZMBYDlXtwA+1y0II1FTg2DsxZrTQGw/QuA+bAA== + dependencies: + "@verida/encryption-utils" "^2.2.1" + "@verida/types" "^2.3.1" + bs58 "^5.0.0" + url "^0.11.0" + +"@verida/keyring@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.3.1.tgz#40fc34e91371325ab6cd3ea5e263f2f0c6d7be51" + integrity sha512-Rbbp36bwOlFZDF6hV2nr+A2GdHVyK1XV5mFumTDl2pdLEPgKcpzGkfBsfx8fyfNEgMfbaoB35hQt90FO4LrEWg== dependencies: - "@verida/encryption-utils" "^2.0.0" + "@verida/encryption-utils" "^2.2.1" + "@verida/types" "^2.3.1" ethers "^5.5.1" tweetnacl "^1.0.3" uuid "^8.3.2" -"@verida/storage-link@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.0.0.tgz#942838a1d8a3a242401548f23f82af90c510135b" - integrity sha512-wqlLhV19+aJacNNunaTSJmN2JGmhzpIzhOY2dTJEWct7VDxXj6xObeCKTYOECGGpPOR6r3TSGAblCQahGrCc+g== +"@verida/storage-link@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.3.4.tgz#b6674b6adb1c0ea88b04b542debbcdabe4758ca5" + integrity sha512-+IoFZX+sN18+w8n4h24Ln4GZ/VdsdNTMyISxjoQc3BoSqVBd3BJFFRNsuti6P3kKWp2AZKl5M88srLex9iQCMw== dependencies: - "@verida/did-client" "^2.0.0" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/keyring" "^2.0.0" + "@verida/did-client" "^2.3.4" + "@verida/did-document" "^2.3.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/keyring" "^2.3.1" did-resolver "^4.0.0" url-parse "^1.5.3" -"@verida/vda-did-resolver@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.0.0.tgz#2c87755d7548f80852eccf97f166ba852517e204" - integrity sha512-8ZBF1JuxNHJCGpYMWKK844b/eYw5ncRZOb0Sj8rW/0wCNjVRFl8cucNhsy9Hp3g1jXDd9mwJBY/jdWzY1Vb0Rg== +"@verida/types@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@verida/types/-/types-2.3.1.tgz#7cc6ab253eb5d1bf6995b9c17c77328f5f68e8b9" + integrity sha512-gbzrVKMNIpUdNrZ/H9T3nCYRNWdYWX1B0cB8sQCMRV5Ad7Xrn4E7WlzN72pT+yWf0NiqwXab4/1jsEdT7UeexA== dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" "@ethersproject/providers" "^5.7.2" - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/vda-did" "^2.0.0" + "@types/node" "^18.15.11" + "@types/pouchdb-core" "^7.0.11" + did-resolver "^4.0.1" + tweetnacl "^1.0.3" + +"@verida/vda-common@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/vda-common/-/vda-common-2.3.4.tgz#06e910151c7d10f266d7dc829325810c92a56795" + integrity sha512-NFkeXt2kAHpcwdBydibxXr/iMDbFi4vFUAGmcuNTwiKKDUmf/G+vXvJkta5+kt71ca3otwddZJYG+EN5maSpRg== + dependencies: + "@verida/encryption-utils" "^2.2.1" + copyfiles "^2.4.1" + ethers "5.5.1" + +"@verida/vda-did-resolver@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.3.4.tgz#516bf02b6ec56c5266ac98462fe993bee583520b" + integrity sha512-6+qGw/TGrQ6cw2TAVs6ka8sHoUn7Tq7qMe9VZSAhD0Ar/pPhc7e+cBEQbzKXP0Z9iFSTB6xipjM5txkTJR8XLg== + dependencies: + "@ethersproject/providers" "^5.7.2" + "@verida/did-document" "^2.3.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/types" "^2.3.1" + "@verida/vda-did" "^2.3.4" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/vda-did@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.0.0.tgz#d650ead5faddd2d5b5eaa537863629ad17bf090e" - integrity sha512-ZYB4t0SdXu0SFUj1hucDd51ktrsI82aRWGyc013KrKIxfM18WjFeCWm7fln5pQt1GYnsXTq03nCtzACMBPCf4w== +"@verida/vda-did@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.3.4.tgz#bf2560466e6e842a66177fb3b3011c96260aba08" + integrity sha512-vJ6flkgXaQH1C0hnCsXDc7efXx4FuBNBDFLj8JMs39i6P3PRqhUzy7veYV0/gx+7ATyQIUI4n1zpAiweHKhNuw== dependencies: - "@verida/did-document" "^2.0.0" - "@verida/encryption-utils" "^2.0.0" - "@verida/vda-did-resolver" "^2.0.0" - "@verida/web3" "^2.0.0" + "@verida/did-document" "^2.3.1" + "@verida/encryption-utils" "^2.2.1" + "@verida/types" "^2.3.1" + "@verida/web3" "^2.3.4" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/web3@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.0.0.tgz#4023ddda769bb13e36d8f48ea3480f25abe84a87" - integrity sha512-+AqqaSgpeFrr12iPCdUiqEqvWa0dlHkN5AmJzrXHGktiBb7vPQxPRKu1dV2mOOhcsTV/grdVKwuB2ZV5/X4lAg== +"@verida/vda-name-client@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-2.3.4.tgz#a0440a2e70b1ca2cef16720f07bbfa26533adb7d" + integrity sha512-gzYQZZhSzLpLk+hs0uVcskEpszr+sn2zY3TMJi3+oAYCZXlZhXG3gKS8jtMxkc7QPL8KN65g6ku+U9reZB2/tA== + dependencies: + "@ethersproject/providers" "^5.7.2" + "@verida/helpers" "^2.3.1" + "@verida/types" "^2.3.1" + "@verida/web3" "^2.3.4" + axios "^0.27.2" + ethers "^5.7.0" + +"@verida/web3@^2.3.4": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.3.4.tgz#f948d8efd811c9157cb458cfe9ef9be0d983794d" + integrity sha512-irxQdSSBlC3h5rwjAt2Bh1mk3jdVJffxG1+a4yAxXeW/AYXqoJmvNrpNhGQ7BgWJYEDqVyhSt57sNS12bMCBrg== dependencies: + "@verida/types" "^2.3.1" + "@verida/vda-common" "^2.3.4" + axios "^1.2.3" ethers "^5.7.0" abbrev@1: @@ -1070,6 +1478,11 @@ base-x@^3.0.2: dependencies: safe-buffer "^5.0.1" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1099,6 +1512,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bech32@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== + binary-case@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/binary-case/-/binary-case-1.1.4.tgz#d687104d59e38f2b9e658d3a58936963c59ab931" @@ -1199,6 +1617,13 @@ bs58@^4.0.1: dependencies: base-x "^3.0.2" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -1267,6 +1692,11 @@ canonicalize@^1.0.5: resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.8.tgz#24d1f1a00ed202faafd9bf8e63352cd4450c6df1" integrity sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A== +canonicalize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-2.0.0.tgz#32be2cef4446d67fd5348027a384cae28f17226a" + integrity sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1431,6 +1861,19 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +copyfiles@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" + integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== + dependencies: + glob "^7.0.5" + minimatch "^3.0.3" + mkdirp "^1.0.4" + noms "0.0.0" + through2 "^2.0.1" + untildify "^4.0.0" + yargs "^16.1.0" + core-decorators@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/core-decorators/-/core-decorators-0.17.0.tgz#3f43180a86d2ab0cc51069f46a1ec3e49e7cebd6" @@ -1622,15 +2065,33 @@ did-jwt@5.7.0: js-sha3 "^0.8.0" uint8arrays "^3.0.0" +did-jwt@^6.11.0: + version "6.11.6" + resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.11.6.tgz#3eeb30d6bd01f33bfa17089574915845802a7d44" + integrity sha512-OfbWknRxJuUqH6Lk0x+H1FsuelGugLbBDEwsoJnicFOntIG/A4y19fn0a8RLxaQbWQ5gXg0yDq5E2huSBiiXzw== + dependencies: + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@stablelib/sha256" "^1.0.1" + "@stablelib/x25519" "^1.0.2" + "@stablelib/xchacha20poly1305" "^1.0.1" + bech32 "^2.0.0" + canonicalize "^2.0.0" + did-resolver "^4.0.0" + elliptic "^6.5.4" + js-sha3 "^0.8.0" + multiformats "^9.6.5" + uint8arrays "^3.0.0" + did-resolver@^3.1.0: version "3.2.2" resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-3.2.2.tgz#6f4e252a810f785d1b28a10265fad6dffee25158" integrity sha512-Eeo2F524VM5N3W4GwglZrnul2y6TLTwMQP3In62JdG34NZoqihYyOZLk+5wUW8sSgvIYIcJM8Dlt3xsdKZZ3tg== did-resolver@^4.0.0, did-resolver@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-4.0.1.tgz#11bb3f19ed1c8f53f4af4702912fa9f7852fc305" - integrity sha512-eHs2VLKhcANmh08S87PKvOauIAmSOd7nb7AlhNxcvOyDAIGQY1UfbiqI1VOW5IDKvOO6aEWY+5edOt1qrCp1Eg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/did-resolver/-/did-resolver-4.1.0.tgz#740852083c4fd5bf9729d528eca5d105aff45eb6" + integrity sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA== diff@5.0.0: version "5.0.0" @@ -1766,7 +2227,43 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -ethers@^5.5.1, ethers@^5.7.0, ethers@^5.7.2: +ethers@5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.1.tgz#d3259a95a42557844aa543906c537106c0406fbf" + integrity sha512-RodEvUFZI+EmFcE6bwkuJqpCYHazdzeR1nMzg+YWQSmQEsNtfl1KHGfp/FWZYl48bI/g7cgBeP2IlPthjiVngw== + dependencies: + "@ethersproject/abi" "5.5.0" + "@ethersproject/abstract-provider" "5.5.1" + "@ethersproject/abstract-signer" "5.5.0" + "@ethersproject/address" "5.5.0" + "@ethersproject/base64" "5.5.0" + "@ethersproject/basex" "5.5.0" + "@ethersproject/bignumber" "5.5.0" + "@ethersproject/bytes" "5.5.0" + "@ethersproject/constants" "5.5.0" + "@ethersproject/contracts" "5.5.0" + "@ethersproject/hash" "5.5.0" + "@ethersproject/hdnode" "5.5.0" + "@ethersproject/json-wallets" "5.5.0" + "@ethersproject/keccak256" "5.5.0" + "@ethersproject/logger" "5.5.0" + "@ethersproject/networks" "5.5.0" + "@ethersproject/pbkdf2" "5.5.0" + "@ethersproject/properties" "5.5.0" + "@ethersproject/providers" "5.5.0" + "@ethersproject/random" "5.5.0" + "@ethersproject/rlp" "5.5.0" + "@ethersproject/sha2" "5.5.0" + "@ethersproject/signing-key" "5.5.0" + "@ethersproject/solidity" "5.5.0" + "@ethersproject/strings" "5.5.0" + "@ethersproject/transactions" "5.5.0" + "@ethersproject/units" "5.5.0" + "@ethersproject/wallet" "5.5.0" + "@ethersproject/web" "5.5.0" + "@ethersproject/wordlists" "5.5.0" + +ethers@^5.5.1, ethers@^5.7.0: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2098,7 +2595,7 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.4: +glob@^7.0.5, glob@^7.1.2, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -2812,7 +3309,7 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2836,6 +3333,11 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mocha@^9.2.1: version "9.2.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" @@ -2881,7 +3383,7 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiformats@^9.4.2: +multiformats@^9.4.2, multiformats@^9.6.5: version "9.9.0" resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== @@ -2940,6 +3442,14 @@ nodemon@^2.0.14: undefsafe "^2.0.5" update-notifier "^5.1.0" +noms@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" + integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== + dependencies: + inherits "^2.0.1" + readable-stream "~1.0.31" + nopt@~1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -3414,10 +3924,10 @@ readable-stream@1.1.14: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@2 || 3", readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +"readable-stream@2 || 3", readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -3436,11 +3946,30 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.3.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~0.0.2: version "0.0.4" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d" integrity sha512-azrivNydKRYt7zwLV5wWUK7YzKTWs3q87xSmY6DlHapPrCvaT6ZrukvM5erV+yCSSPmZT8zkSdttOHQpWWm9zw== +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -3802,7 +4331,7 @@ through2@3.0.2: inherits "^2.0.4" readable-stream "2 || 3" -through2@^2.0.3: +through2@^2.0.1, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -4014,6 +4543,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + update-notifier@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" @@ -4064,6 +4598,14 @@ url@0.10.3: punycode "1.3.2" querystring "0.2.0" +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4229,7 +4771,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: +yargs@16.2.0, yargs@^16.1.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== From 6e73d1b19a5689817b9b086f96743d5f67dc8a8c Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 28 Apr 2023 17:17:59 +0930 Subject: [PATCH 27/33] Fix client creation --- src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index 36370548..c299a5b9 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -33,7 +33,7 @@ export class Utils { const network = new Client({ environment: VERIDA_ENVIRONMENT }) - const account = new AutoAccount(DEFAULT_ENDPOINTS, { + const account = new AutoAccount({ privateKey: PRIVATE_KEY, environment: VERIDA_ENVIRONMENT, // @ts-ignore From a1e1fb0413be848275db96793d677aab2376ee35 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 23 May 2023 14:29:02 +0930 Subject: [PATCH 28/33] Add IPFS entries to server config --- src/serverconfig.json | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/serverconfig.json b/src/serverconfig.json index 8208a32c..56e47010 100644 --- a/src/serverconfig.json +++ b/src/serverconfig.json @@ -1,6 +1,6 @@ { - "serverUrl": "http://192.168.68.124:5021", - "assetsUrl": "http://192.168.68.124:5021/assets", + "serverUrl": "http://192.168.68.128:5021", + "assetsUrl": "http://192.168.68.128:5021/assets", "logLevel": "debug", "verida": { "environment": "testnet", @@ -39,42 +39,50 @@ }, "testing": { "contextName": "Verida Testing: Fake Vault", - "veridaPrivateKey": "0x00d3b996ec98a9a536efecfbae40e5eaaf117765a587483c69195c9460165d37", - "encryptionKey": "aa8898c013c239012cec066f5cbb0165" + "veridaPrivateKey": "", + "encryptionKey": "" }, "providers": { "facebook": { "label": "Facebook", - "appId": "1118636508992307", - "appSecret": "5a88987023c239012cec066f5c200175", + "appId": "", + "appSecret": "", + "sbtImage": "https://data.verida.network/ipfs/QmcCoAjMWQpz7FwJi1d7jSh9EJ1m3xY1FRGxPi9pu3Rit7/FacebookBadge.png", "followingLimit": 20, "postLimit": 20, "testing": { - "accessToken": "EAAP5ZANvAUzMBAPYqkvmGZCSk9WZBL2kMO34sTG2m0XXlLOEg83GZAvBvjDEZAKPOqYuMaE1OPXUTyDXHuBQ4zN01Vtdpp1jKA9z98JbZALSBMQKvssCL580n9QyWqOV8CTTOZCVqNVSr8wrZAr97mvfZAZAtGrL0W6vuiCi8coeN4rRIuTO33pJqK8Deo2rOpj1PgV5XXpjQU3aQJhabb5qw7pEeXjFlaHTJqreFa4K5eECIutyi3OLF8" + "accessToken": "" } }, "twitter-verida": { "label": "Twitter", - "apiKey": "oPPIdjDTQMCerrUqpIbW8sEzl", - "apiSecret": "fGEXBRkn2ISp7TFBtJisSAeyo0WONzV8TxGzPMlAcC3SjZ8z5M", - "bearerToken": "AAAAAAAAAAAAAAAAAAAAAJeLdAEAAAAAnwbWfKEUlhJvxYNUk%2F2xoqNH0Vs%3DKGopJYVV59gWCOfm0CovUjLI9w7mAyxVxXtokpDwIBApfLboDR", + "apiKey": "", + "apiSecret": "", + "bearerToken": "", "followingLimit": 20, "postLimit": 20, "testing": { - "accessToken": "1196640912450834433-DmjuIJ6kHXNQaqpENJK0v1pWf1OajD", - "refreshToken": "ZNwoOzEjsLs92IIYSeGilKZ1mUFDM8XeSYuMMqF7TZ9gM" + "accessToken": "", + "refreshToken": "" } }, "twitter": { "label": "Twitter", - "clientID": "RHAxQUZmLVVMbm9NN2puajluZmE6MTpjaQ", - "clientSecret": "G0oWBZkgxVG7KCy8_5r4eHvxh-tQ8GoLmQm4mvsJi4zxhlpvIr", + "clientID": "", + "clientSecret": "", + "sbtImage": "https://data.verida.network/ipfs/QmWpmaBusMENzxLJb5RJUzp951sXPm9GLQCy4pt5zC2XdU/TwitterBadge.png", "followingLimit": 20, "postLimit": 20, "testing": { - "accessToken": "bUNON0JrQ2lRcHE5LUtnaElqX05yUUh6dHdpdzRlbkpDSGo0Nks3azBJeEtvOjE2NzQxMDU2MzMyNjI6MTowOmF0OjE", - "refreshToken": "X0g2ODZVLVNDYjU2NUtfZ1pFcUUyZ0xPMGtFNDlHTHNfNWpiNmZadUh3R1EyOjE2NzQxMDU2MzMyNjI6MTowOnJ0OjE" + "accessToken": "", + "refreshToken": "" } + }, + "discord": { + "label": "Discord", + "clientID": "", + "clientSecret": "", + "sbtImage": "" } }, "providerDefaults": { From 4730f56fe51b8e2b0bf973438178a7bbe3077e0a Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 1 Dec 2023 11:40:13 +1030 Subject: [PATCH 29/33] Improve error handling for invalid token. Improve display of complete connection page. --- src/controller.ts | 58 ++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/src/controller.ts b/src/controller.ts index 64ad3eb2..e301de4f 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -80,27 +80,43 @@ export default class Controller { const provider = Providers(providerName) // @todo: handle error and show error message - const connectionToken = await provider.callback(req, res, next) - - // @ts-ignore - const did = req.session.did - - // Send the access token, refresh token and profile database name and encryption key - // so the user can pull their profile remotely and store their tokens securely - // This also avoids this server saving those credentials anywhere, they are only stored by the user - const redirectUrl = `https://vault.verida.io/connection-success?provider=${providerName}&accessToken=${connectionToken.accessToken}&refreshToken=${connectionToken.refreshToken ? connectionToken.refreshToken : ''}` - - // @todo: Generate nice looking thank you page - const output = ` - - -

- - ` - - res.send(output) + try { + const connectionToken = await provider.callback(req, res, next) + + // @ts-ignore + const did = req.session.did + + // Send the access token, refresh token and profile database name and encryption key + // so the user can pull their profile remotely and store their tokens securely + // This also avoids this server saving those credentials anywhere, they are only stored by the user + const redirectUrl = `https://vault.verida.io/connection-success?provider=${providerName}&accessToken=${connectionToken.accessToken}&refreshToken=${connectionToken.refreshToken ? connectionToken.refreshToken : ''}` + + // @todo: Generate nice looking thank you page + const output = ` + + +
+ +
+ + ` + + res.send(output) + } catch (err: any) { + // @todo: Generate nice looking thank you page + const output = ` + + +
+

Error

+

${err.message}

+
+ + ` + + res.send(output) + } } /** From bf53b219a7a6afdc12b74ae53d5377e0bbdad6ce Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 16 Jan 2024 11:27:26 +1030 Subject: [PATCH 30/33] Update to latest verida dependencies --- package.json | 18 +-- yarn.lock | 450 ++++++++++++++++++++++----------------------------- 2 files changed, 204 insertions(+), 264 deletions(-) diff --git a/package.json b/package.json index 4273360f..52b50566 100644 --- a/package.json +++ b/package.json @@ -32,15 +32,15 @@ "@oauth-everything/passport-discord": "^1.0.2", "@sapphire/snowflake": "^3.4.2", "@superfaceai/passport-twitter-oauth2": "^1.2.3", - "@verida/account-node": "^2.3.4", - "@verida/client-ts": "^2.3.4", - "@verida/did-client": "^2.3.4", - "@verida/encryption-utils": "^2.2.1", - "@verida/types": "^2.3.1", - "@verida/web3": "^2.3.4", - "@verida/helpers": "^2.2.1", - "@verida/vda-sbt-client": "^2.2.1", - "@verida/verifiable-credentials": "^2.2.1", + "@verida/account-node": "^3.0.1", + "@verida/client-ts": "^3.0.2", + "@verida/did-client": "^3.0.1", + "@verida/encryption-utils": "^3.0.0", + "@verida/helpers": "^3.0.1", + "@verida/types": "^3.0.0", + "@verida/vda-sbt-client": "^3.0.2", + "@verida/verifiable-credentials": "^3.0.2", + "@verida/web3": "^3.0.1", "aws-serverless-express": "^3.4.0", "axios": "^1.2.3", "body-parser": "^1.19.0", diff --git a/yarn.lock b/yarn.lock index 2e02e8c4..d04b8721 100644 --- a/yarn.lock +++ b/yarn.lock @@ -963,9 +963,9 @@ "@types/node" "*" "@types/debug@*": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" @@ -1016,9 +1016,9 @@ "@types/serve-static" "*" "@types/json-schema@^7.0.6": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -1036,9 +1036,9 @@ integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node@*": version "17.0.35" @@ -1046,9 +1046,11 @@ integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== "@types/node@^18.15.11": - version "18.16.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.2.tgz#2f610ea71034b3971c312192377f8a7178eb57f1" - integrity sha512-GQW/JL/5Fz/0I8RpeBG9lKp0+aNcXEaVL71c0D2Q0QHDTFvlYKT7an0onCUXj85anv7b4/WesqdfchLc0jtsCg== + version "18.19.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.7.tgz#9a5f6ac7ec42a5dff68fe7faf2dd359710de4a12" + integrity sha512-IGRJfoNX10N/PfrReRZ1br/7SQ+2vF/tK3KXNwzXz82D32z5dMQEoOlFew18nLSN+vMNcLY4GrKfzwi/yWI8/w== + dependencies: + undici-types "~5.26.4" "@types/oauth@*": version "0.9.1" @@ -1073,26 +1075,18 @@ dependencies: "@types/express" "*" -"@types/pouchdb-core@*": - version "7.0.10" - resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.10.tgz#d1ea1549e7fad6cb579f71459b1bc27252e06a5a" - integrity sha512-mKhjLlWWXyV3PTTjDhzDV1kc2dolO7VYFa75IoKM/hr8Er9eo8RIbS7mJLfC8r/C3p6ihZu9yZs1PWC1LQ0SOA== - dependencies: - "@types/debug" "*" - "@types/pouchdb-find" "*" - -"@types/pouchdb-core@^7.0.11": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.11.tgz#8fad7a16889dafab765415430a491eb50a54f564" - integrity sha512-KTKj0Taf8pLTj8eW3qBtCd1Fh+/yhEyVo6/1czTN46MnseobdmnqgXtzaKgHMbuLouh+SHK1vM++aMPaG1qTTA== +"@types/pouchdb-core@*", "@types/pouchdb-core@^7.0.11": + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.14.tgz#4d3012345af53e416ddaed4d7f2c3d73dc1363e5" + integrity sha512-ec63FAtmc1ForP4oNgLZoPYqjaBrkGTWA7jm+rQ7SEtIpOPpN4NCWF2/JyrhO64jjIzO5qkV/YNEpZlEZFxCcw== dependencies: "@types/debug" "*" "@types/pouchdb-find" "*" "@types/pouchdb-find@*": - version "6.3.7" - resolved "https://registry.yarnpkg.com/@types/pouchdb-find/-/pouchdb-find-6.3.7.tgz#f713534a53c1a7f3fd8fbbfb74131a1b04711ddc" - integrity sha512-b2dr9xoZRK5Mwl8UiRA9l5j9mmCxNfqXuu63H1KZHwJLILjoIIz7BntCvM0hnlnl7Q8P8wORq0IskuaMq5Nnnw== + version "7.3.3" + resolved "https://registry.yarnpkg.com/@types/pouchdb-find/-/pouchdb-find-7.3.3.tgz#599e388e2a1c4e57ee8aba0d5deca24d37b6978e" + integrity sha512-U7zXk67s9Ar+9Pwj5kSbuMnn8zif0AOOIPy4KRFeJ/S/Tk+mNS90soj+3OV21H8xyB7WTxjvS1JLablZC6C6ow== dependencies: "@types/pouchdb-core" "*" @@ -1139,46 +1133,46 @@ binary-case "^1.0.0" type-is "^1.6.16" -"@verida/account-node@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-2.3.4.tgz#ceaabcce30ba0ccdf8f8c43f2a09c837912becc7" - integrity sha512-ydSkkMQ1CseGEiOl+nhauqSvecnvQpSgUwaW1T/29q6ALjuTWb2CZBrDq00+T0nGIU6emIHc2mfnWKwOyw3IDw== - dependencies: - "@verida/account" "^2.3.4" - "@verida/did-client" "^2.3.4" - "@verida/did-document" "^2.3.1" - "@verida/encryption-utils" "^2.2.1" - "@verida/keyring" "^2.3.1" - "@verida/types" "^2.3.1" +"@verida/account-node@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/account-node/-/account-node-3.0.1.tgz#c2b45ff14137cd270186d32d9dadd88c2b28f7f9" + integrity sha512-S6zqCathYR/iRDYZBAa3B3Ze6LkQBdmBuNhWZvcW5KIlGMDwdUpg5N6VXZmhbrBSHUeYJVPdN8eJZWjss+8vLg== + dependencies: + "@verida/account" "^3.0.1" + "@verida/did-client" "^3.0.1" + "@verida/did-document" "^3.0.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/keyring" "^3.0.1" + "@verida/types" "^3.0.0" axios "^0.27.2" did-resolver "^4.0.1" -"@verida/account@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/account/-/account-2.3.4.tgz#019618a695a4df16e44228aa7d4bbb0b0cce7fa5" - integrity sha512-V9hHoHG6gs9ybsUFsfGyeUiIuS1lDPaErz+Dt5Skxg0wI5Ebiyy+lXAJD+ff6P0TJpWoTtxRWOqvE54O4h4A0A== +"@verida/account@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/account/-/account-3.0.1.tgz#f6441b744956a77dccd376a441d88544919b0751" + integrity sha512-5i77Hwk4mCSyUZuJQ8iMTsGYeq1rj6wM7mlpiuJLAK8Zj0JJwMP5x8oE5xsd9IWpNQ9xjFv8C6l/lYpe3425uA== dependencies: - "@verida/keyring" "^2.3.1" - "@verida/storage-link" "^2.3.4" - "@verida/types" "^2.3.1" + "@verida/keyring" "^3.0.1" + "@verida/storage-link" "^3.0.1" + "@verida/types" "^3.0.0" did-jwt "^6.11.0" did-resolver "^4.0.1" lodash "^4.17.21" tweetnacl-util "^0.15.1" -"@verida/client-ts@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-2.3.4.tgz#a95e3442c471750830b4b7fe48cdc0d29f443833" - integrity sha512-fk5zncegmfW4Bf8nwMh64qmxcr4PRSq9bE3iLk0EmMVIJtVN0tOEyZCIBXlpJmmVAXz/hQ1RwgQC4BdE6MPMyg== - dependencies: - "@verida/account" "^2.3.4" - "@verida/did-client" "^2.3.4" - "@verida/did-document" "^2.3.1" - "@verida/encryption-utils" "^2.2.1" - "@verida/keyring" "^2.3.1" - "@verida/storage-link" "^2.3.4" - "@verida/types" "^2.3.1" - "@verida/vda-name-client" "^2.3.4" +"@verida/client-ts@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@verida/client-ts/-/client-ts-3.0.2.tgz#e626728ca8ab3f21f94483670b0e822b5bc8e250" + integrity sha512-nk+hzmis1kMmAUfr8ZwNA4raxOMPrrLxhWqHrwHBvpjtgA8luVV67x2rU6USzNCcJCLEFdjUlFEVJjms5Mahow== + dependencies: + "@verida/account" "^3.0.1" + "@verida/did-client" "^3.0.1" + "@verida/did-document" "^3.0.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/keyring" "^3.0.1" + "@verida/storage-link" "^3.0.1" + "@verida/types" "^3.0.0" + "@verida/vda-name-client" "^3.0.1" ajv "^8.6.3" ajv-formats "^2.1.1" axios "^0.21.2" @@ -1193,128 +1187,83 @@ pouchdb-find "^7.2.2" uuid "^8.3.2" -"@verida/did-client@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-2.3.4.tgz#05dd11c2235fc79318f14abc5609d4aec7102a6a" - integrity sha512-9YTYTaJnzEHlkJ6SyXuKTINKNnAokSAW38WSbk+pc4orAteDbcH39PBv+1oC0c36nJeU7iejFg5tAbEmBpScyw== - dependencies: - "@verida/did-document" "^2.3.1" - "@verida/types" "^2.3.1" - "@verida/vda-common" "^2.3.4" - "@verida/vda-did-resolver" "^2.3.4" - "@verida/web3" "^2.3.4" +"@verida/did-client@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/did-client/-/did-client-3.0.1.tgz#448a2c1a2a9fdbb631f3176daf5b182c5f2fee4c" + integrity sha512-eySImxml+HHkWpqSH4fScK/0aHBe9T+SE4SEKSPBLYFoJ8BHtbhw9ZF4dE22IdIciVj08z3PRZfKA5/rCr73PQ== + dependencies: + "@verida/did-document" "^3.0.1" + "@verida/types" "^3.0.0" + "@verida/vda-common" "^3.0.0" + "@verida/vda-did-resolver" "^3.0.1" + "@verida/web3" "^3.0.1" axios "^0.23.0" deepcopy "^2.1.0" did-resolver "^4.0.1" ethers "^5.5.1" -"@verida/did-document@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.2.1.tgz#6f2939a19bf0027ca8e26bf469404ae950a74193" - integrity sha512-QQKJj7viZf/S4LDT1+YqnhUEnuJxMzUtyGXNF1C4k5KkPNgGCd1GOi/lJtOZbfKI9UV17WYvCHAI1wr4nzkbsw== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@verida/encryption-utils" "^2.2.1" - "@verida/keyring" "^2.2.1" - "@verida/types" "^2.2.0" - did-resolver "^4.0.1" - lodash "^4.17.21" - -"@verida/did-document@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-2.3.1.tgz#33703386f95b1b54e88af1bf4e763627bea0005e" - integrity sha512-YV53vBnVKn2eNLQB/XkK9j+NmW9pxFV1emwGuDbULlewu1VOwsk2vEqPVWg0mhtkbr2x59xXiewE8LSvE5iwjQ== +"@verida/did-document@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/did-document/-/did-document-3.0.1.tgz#6f2c0c596d8eb026bbb8f61fc6045a5de034876a" + integrity sha512-bqLpGEsmoACrGdnFiulxeoHzOwYyMRKET1L+QXHfAncVUe8UhDeyEmikLD2K2RqpxJN2i5AonKhfhKxdXy+FhA== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" "@ethersproject/transactions" "^5.7.0" - "@verida/encryption-utils" "^2.2.1" - "@verida/keyring" "^2.3.1" - "@verida/types" "^2.3.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/keyring" "^3.0.1" + "@verida/types" "^3.0.0" did-resolver "^4.0.1" lodash "^4.17.21" -"@verida/encryption-utils@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-2.2.1.tgz#76104228a194187f8019bf97e6b609d6742c67a3" - integrity sha512-0UNlTd9In2JJD8Ov5RXX9t4ta52gtpwJvg00nR4oT8TpMH7B2SEaLzJZqvBK3cRb3Y5IMJxdmjDhiParj9a+zw== +"@verida/encryption-utils@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@verida/encryption-utils/-/encryption-utils-3.0.0.tgz#21434720e3c9d28a9df074e353d255959877a82d" + integrity sha512-qaCvVFeEV4QKJl5quN/XMFCKwsCHE5hzjUdQAutlp74ItnXe0YGwZzjqXUYynBKkldCyZQpRoeH16e4GFFSBSQ== dependencies: ethers "^5.5.1" json.sortify "^2.2.2" tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@verida/helpers@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.2.1.tgz#f3ea2b183e133d9f96c052b7b65da694bfed8c2f" - integrity sha512-Ozv9UTgHs3aLPOB1D7Cg/dvDl1GzAtSkGrP+eddUkZHpI5tp2b6W4McUd7sWDdERAmPAuKbeWeAZdnMXgRSlSQ== - dependencies: - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.2.0" - bs58 "^5.0.0" - url "^0.11.0" - -"@verida/helpers@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-2.3.1.tgz#9adbfdbd898b628635550dae67a730c8e67252a9" - integrity sha512-NkELT6fGhF56F4prwzx32HKsaiY0o1RmQh6omT4TkRfoPEf6ZMBYDlXtwA+1y0II1FTg2DsxZrTQGw/QuA+bAA== +"@verida/helpers@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/helpers/-/helpers-3.0.1.tgz#f4a57f91a33dded0237e728da963c52435e52dfe" + integrity sha512-KJjvyW1AMsaDGxVru1DR2u/QeOmEMk7m2ieoQnrl917ENYIyCzT0qFuqab91a6i8Q99IWKZC5an+tXYCOpQ9RA== dependencies: - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.3.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/types" "^3.0.0" + axios "^1.6.2" bs58 "^5.0.0" url "^0.11.0" -"@verida/keyring@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.2.1.tgz#1114835c381670a75f2549a6b25c9e9d668d846e" - integrity sha512-IhzdWTWtBFigc7Q98CQdh25Tr6iFrwZ0fWdhR8UE1EDgLf27h2aAukm5a23jhAiO5ILW8tD7KW6dyEanfayQ4w== - dependencies: - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.2.0" - ethers "^5.5.1" - tweetnacl "^1.0.3" - uuid "^8.3.2" - -"@verida/keyring@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-2.3.1.tgz#40fc34e91371325ab6cd3ea5e263f2f0c6d7be51" - integrity sha512-Rbbp36bwOlFZDF6hV2nr+A2GdHVyK1XV5mFumTDl2pdLEPgKcpzGkfBsfx8fyfNEgMfbaoB35hQt90FO4LrEWg== +"@verida/keyring@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/keyring/-/keyring-3.0.1.tgz#8552ca13a0541c55352f59cc00c0127ffbcaf77a" + integrity sha512-dmWhAlkT2hz7FIHnMUuYlvvaQL57Ps/JicXdqzhmslNqt7Lez0/o1vqpyJ58ZPnhI/Lv7e0MOEqNnWDb1p3aGw== dependencies: - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.3.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/types" "^3.0.0" ethers "^5.5.1" tweetnacl "^1.0.3" uuid "^8.3.2" -"@verida/storage-link@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-2.3.4.tgz#b6674b6adb1c0ea88b04b542debbcdabe4758ca5" - integrity sha512-+IoFZX+sN18+w8n4h24Ln4GZ/VdsdNTMyISxjoQc3BoSqVBd3BJFFRNsuti6P3kKWp2AZKl5M88srLex9iQCMw== +"@verida/storage-link@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/storage-link/-/storage-link-3.0.1.tgz#e2e02e8a058016429ac6dc4de1367df8298c2e68" + integrity sha512-fkerqqb98XvjsilqrE531pLNptGntx9MEOFi28jfu3HWTMWutIZNcT4vLIo2QxxObD/7EG0sZzJGTHmRdHPx5w== dependencies: - "@verida/did-client" "^2.3.4" - "@verida/did-document" "^2.3.1" - "@verida/encryption-utils" "^2.2.1" - "@verida/keyring" "^2.3.1" + "@verida/did-client" "^3.0.1" + "@verida/did-document" "^3.0.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/keyring" "^3.0.1" did-resolver "^4.0.0" url-parse "^1.5.3" -"@verida/types@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@verida/types/-/types-2.2.0.tgz#e5a3ba70b775350cebe061fb92e7be1ced5a67f5" - integrity sha512-IsnUkXaXosXJwGkFih9CrsbM3O5v8Ma3ik2DV3shz7FARt6RhyXtRsWfffqWShQWiAJ1EzdvmtLKFfc7/bmFtA== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/providers" "^5.7.2" - did-resolver "^4.0.1" - tweetnacl "^1.0.3" - -"@verida/types@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@verida/types/-/types-2.3.1.tgz#7cc6ab253eb5d1bf6995b9c17c77328f5f68e8b9" - integrity sha512-gbzrVKMNIpUdNrZ/H9T3nCYRNWdYWX1B0cB8sQCMRV5Ad7Xrn4E7WlzN72pT+yWf0NiqwXab4/1jsEdT7UeexA== +"@verida/types@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@verida/types/-/types-3.0.0.tgz#1ffb64eea5d2c1fcb66c386f979d88918c943dcf" + integrity sha512-J5psSf9ayqvUVyRBwYWjZ3Zeiomnl/GsHpvn2GA6zwH39QS8bPAvVGHaaq7na+0M1VUysrDEvHFrQ9fSmGAbHw== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -1324,120 +1273,89 @@ did-resolver "^4.0.1" tweetnacl "^1.0.3" -"@verida/vda-common@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/vda-common/-/vda-common-2.3.4.tgz#06e910151c7d10f266d7dc829325810c92a56795" - integrity sha512-NFkeXt2kAHpcwdBydibxXr/iMDbFi4vFUAGmcuNTwiKKDUmf/G+vXvJkta5+kt71ca3otwddZJYG+EN5maSpRg== +"@verida/vda-common@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@verida/vda-common/-/vda-common-3.0.0.tgz#951c1b0fe1ba700c18a2f9848e22d8b8a0d26d97" + integrity sha512-T24EPcExnbCY1GyQcSThydExaRm2I4Mx38yUE+MkJwnvI7Q1lHNZEacEcDr+jnURAuBsLvp6jIiZAutZdEVdfA== dependencies: - "@verida/encryption-utils" "^2.2.1" + "@verida/encryption-utils" "^3.0.0" copyfiles "^2.4.1" ethers "5.5.1" -"@verida/vda-did-resolver@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.2.1.tgz#91f0f49ea0573181b4beb2b8157c79d5ca289642" - integrity sha512-uK6tvS3D+oNFM65EH7I6gdtPjVFH/1ULjIR09dgAbUXeaPSq4sX5zbkFe8+iUzNfB4lKne2ZRsa2u5lL66Upww== - dependencies: - "@ethersproject/providers" "^5.7.2" - "@verida/did-document" "^2.2.1" - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.2.0" - "@verida/vda-did" "^2.2.1" - axios "1.2.0-alpha.1" - lodash "^4.17.21" - -"@verida/vda-did-resolver@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-2.3.4.tgz#516bf02b6ec56c5266ac98462fe993bee583520b" - integrity sha512-6+qGw/TGrQ6cw2TAVs6ka8sHoUn7Tq7qMe9VZSAhD0Ar/pPhc7e+cBEQbzKXP0Z9iFSTB6xipjM5txkTJR8XLg== +"@verida/vda-did-resolver@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/vda-did-resolver/-/vda-did-resolver-3.0.1.tgz#9244dd9b0fd8b5b6f9c070501b49d055c50c2cd6" + integrity sha512-dFUPUsb8detiSReN9/ocKm4+pRdOSKPT1ar7owHo0OdELZ8hLX80Y3Nd+1sU9nUn7dYxqmCnPwOZGM42MP3tSQ== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/did-document" "^2.3.1" - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.3.1" - "@verida/vda-did" "^2.3.4" - axios "1.2.0-alpha.1" - lodash "^4.17.21" - -"@verida/vda-did@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.2.1.tgz#e5fc89f87678e2c698cbfbba655d33d6bbcc8958" - integrity sha512-SZYHtkBEOeR/BMv1ui+wBu9dVNmd+gGBeAWBzfjV9l8N1DxYAGnRnO/VqPa0c7d4JvpNBLwBvyb9GaTFEi7waQ== - dependencies: - "@verida/did-document" "^2.2.1" - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.2.0" - "@verida/web3" "^2.2.1" + "@verida/did-document" "^3.0.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/types" "^3.0.0" + "@verida/vda-common" "^3.0.0" + "@verida/vda-did" "^3.0.1" axios "1.2.0-alpha.1" lodash "^4.17.21" -"@verida/vda-did@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-2.3.4.tgz#bf2560466e6e842a66177fb3b3011c96260aba08" - integrity sha512-vJ6flkgXaQH1C0hnCsXDc7efXx4FuBNBDFLj8JMs39i6P3PRqhUzy7veYV0/gx+7ATyQIUI4n1zpAiweHKhNuw== +"@verida/vda-did@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/vda-did/-/vda-did-3.0.1.tgz#0b72caf0a8a93e72b182ec9ca7f3690ab2a3f4f8" + integrity sha512-wgePZNnsVAIfOwk7cDAGCrGyRCgGLyu7PKasonpVs45vTyEVJt74WpAr0m/kLsqUEVPiTSY1jwvuI1A2wE4TqA== dependencies: - "@verida/did-document" "^2.3.1" - "@verida/encryption-utils" "^2.2.1" - "@verida/types" "^2.3.1" - "@verida/web3" "^2.3.4" + "@verida/did-document" "^3.0.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/types" "^3.0.0" + "@verida/web3" "^3.0.1" axios "1.2.0-alpha.1" + ethers "^5.7.2" lodash "^4.17.21" -"@verida/vda-name-client@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-2.3.4.tgz#a0440a2e70b1ca2cef16720f07bbfa26533adb7d" - integrity sha512-gzYQZZhSzLpLk+hs0uVcskEpszr+sn2zY3TMJi3+oAYCZXlZhXG3gKS8jtMxkc7QPL8KN65g6ku+U9reZB2/tA== +"@verida/vda-name-client@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/vda-name-client/-/vda-name-client-3.0.1.tgz#2ad8a4556c810d6280a5abc45f9fa3c3da088a64" + integrity sha512-HAGro7kQ1hf6oz9gpGJEbHfjQGbUUYZBmjJKSg+wzRM8pKfXnMuN5R4iRVoR6TPpcwoNhbrce4toO4NQybyYAw== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/helpers" "^2.3.1" - "@verida/types" "^2.3.1" - "@verida/web3" "^2.3.4" + "@verida/helpers" "^3.0.1" + "@verida/types" "^3.0.0" + "@verida/web3" "^3.0.1" axios "^0.27.2" ethers "^5.7.0" -"@verida/vda-sbt-client@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/vda-sbt-client/-/vda-sbt-client-2.2.1.tgz#9b5b2bda2705694f739034a5f7859593c6f396f1" - integrity sha512-SrqdM0HEnxzAybVpn9yyy0WL1ZSIvoPxwTmBOkrlPb/86/bsZIYiC1Iuae2g8XsdCu06S1I+gr/Qu8EzdyBTrw== +"@verida/vda-sbt-client@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@verida/vda-sbt-client/-/vda-sbt-client-3.0.2.tgz#e0fe03a10b38105c80d4a1315faae4f4c46c3f83" + integrity sha512-WqkSUBlKL+zHISn/VYTVBfMJHRxJpRG7V+aGFt4efrkhC7ZaOz43EPoTGHjOFAI8CUOwozGHMpVbzu1lze2W5Q== dependencies: "@ethersproject/providers" "^5.7.2" - "@verida/helpers" "^2.2.1" - "@verida/web3" "^2.2.1" + "@verida/helpers" "^3.0.1" + "@verida/web3" "^3.0.1" axios "^0.27.2" ethers "^5.7.0" -"@verida/verifiable-credentials@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/verifiable-credentials/-/verifiable-credentials-2.2.1.tgz#beda4742f7cc8cdfada13ccf404c36fa36b546f0" - integrity sha512-oQ0RR3NLchrlnYhICqP8JZBSFBn2W1ZTUWUoJnJkspP5p4AGAET58ZizHtYWqL5D26RdYrDrNq0kIoHxG9y4Og== +"@verida/verifiable-credentials@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@verida/verifiable-credentials/-/verifiable-credentials-3.0.2.tgz#1b84d334b23a2b6a6e658a2a077d2718dde0b373" + integrity sha512-M68/JDtsw6Se4fvL5NIFUYZDoEC4t2D2AC7SUnh4ENRPMnVaKNFlthfZ8hBcUOg5H8RzYaeeGY8Fc0IBPeBuwQ== dependencies: - "@verida/encryption-utils" "^2.2.1" - "@verida/helpers" "^2.2.1" - "@verida/types" "^2.2.0" - "@verida/vda-did-resolver" "^2.2.1" + "@verida/encryption-utils" "^3.0.0" + "@verida/helpers" "^3.0.1" + "@verida/types" "^3.0.0" + "@verida/vda-did-resolver" "^3.0.1" axios "^1.3.3" dayjs "^1.10.7" did-jwt "^6.11.0" - did-jwt-vc "^3.1.0" + did-jwt-vc "3.1.0" lodash "^4.17.21" tweetnacl-util "^0.15.1" url "^0.11.0" -"@verida/web3@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.2.1.tgz#16b338ed5b452a3269fdf2752a3d255ad7807744" - integrity sha512-5h6STyoKkZUDGVgoZt6CSOT09HzHdFV1MlshzDf4wqe2eT1hLzfyZsruSZiu20iiW/HgX4AwgBjH0o4Ga1ddrg== - dependencies: - axios "^1.2.3" - ethers "^5.7.0" - -"@verida/web3@^2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-2.3.4.tgz#f948d8efd811c9157cb458cfe9ef9be0d983794d" - integrity sha512-irxQdSSBlC3h5rwjAt2Bh1mk3jdVJffxG1+a4yAxXeW/AYXqoJmvNrpNhGQ7BgWJYEDqVyhSt57sNS12bMCBrg== +"@verida/web3@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@verida/web3/-/web3-3.0.1.tgz#92a776f3b1872099039fe79e0017caa334acbfe6" + integrity sha512-XLfwUkG93vh7/4t/cJmtROcu31Gz+7Wj0aCmGE2p3go3iMZzFH03+EmK90xvtQrISbzrmBkxhsThJ1BTbZRiSg== dependencies: - "@verida/types" "^2.3.1" - "@verida/vda-common" "^2.3.4" + "@verida/types" "^3.0.0" + "@verida/vda-common" "^3.0.0" axios "^1.2.3" ethers "^5.7.0" @@ -1714,12 +1632,12 @@ axios@^1.2.3: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" - integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== +axios@^1.3.3, axios@^1.6.2: + version "1.6.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" + integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.4" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -2237,9 +2155,9 @@ date-format@^4.0.10: integrity sha512-RuMIHocrVjF84bUSTcd1uokIsLsOsk1Awb7TexNOI3f48ukCu39mjslWquDTA08VaDMF2umr3MB9ow5EyJTWyA== dayjs@^1.10.7: - version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== dayjs@^1.11.1: version "1.11.2" @@ -2326,12 +2244,12 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -did-jwt-vc@^3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-3.1.3.tgz#a5dabf2442752e1666f54ef2dbe01befcc83987f" - integrity sha512-qB1FiQ0sT/FUR5+mQ//P5lS0Gllrtes2OxC3WVMOt8ND0LolF92ohozv50ukyOvB2zBzgfm5durcIPqQcoI+LA== +did-jwt-vc@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/did-jwt-vc/-/did-jwt-vc-3.1.0.tgz#aa7877c4c1f26ba11883604ac0ece30ca4fe78a4" + integrity sha512-8N54No9RQpbDM4a/aMiGc/tZWubtH8bqi7DLnO6B62AdWaNVKeS9ddcuANztSS1yTuypyzlyeeEtCTqEzpYgjA== dependencies: - did-jwt "^6.11.0" + did-jwt "^6.6.0" did-resolver "^4.0.0" did-jwt@5.7.0: @@ -2350,7 +2268,7 @@ did-jwt@5.7.0: js-sha3 "^0.8.0" uint8arrays "^3.0.0" -did-jwt@^6.11.0: +did-jwt@^6.11.0, did-jwt@^6.6.0: version "6.11.6" resolved "https://registry.yarnpkg.com/did-jwt/-/did-jwt-6.11.6.tgz#3eeb30d6bd01f33bfa17089574915845802a7d44" integrity sha512-OfbWknRxJuUqH6Lk0x+H1FsuelGugLbBDEwsoJnicFOntIG/A4y19fn0a8RLxaQbWQ5gXg0yDq5E2huSBiiXzw== @@ -2572,7 +2490,7 @@ ethers@5.5.1: "@ethersproject/web" "5.5.0" "@ethersproject/wordlists" "5.5.0" -ethers@^5.5.1, ethers@^5.7.0: +ethers@^5.5.1, ethers@^5.7.0, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2770,7 +2688,12 @@ follow-redirects@^1.14.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== -follow-redirects@^1.14.4, follow-redirects@^1.14.9, follow-redirects@^1.15.0: +follow-redirects@^1.14.4, follow-redirects@^1.14.9, follow-redirects@^1.15.4: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -4174,6 +4097,11 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -4193,6 +4121,13 @@ qs@6.10.3, qs@^6.9.4: dependencies: side-channel "^1.0.4" +qs@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -4723,9 +4658,9 @@ touch@^3.1.0: nopt "~1.0.10" "tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0": - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -4885,6 +4820,11 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.21.0: version "5.21.2" resolved "https://registry.yarnpkg.com/undici/-/undici-5.21.2.tgz#329f628aaea3f1539a28b9325dccc72097d29acd" @@ -4975,12 +4915,12 @@ url@0.10.3: querystring "0.2.0" url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== dependencies: - punycode "1.3.2" - querystring "0.2.0" + punycode "^1.4.1" + qs "^6.11.2" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" From 9588f26e4682775a7f824dd13e47286986587004 Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 27 Jan 2024 12:26:46 +1030 Subject: [PATCH 31/33] Improve layout of HTML pages --- src/controller.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/controller.ts b/src/controller.ts index e301de4f..595e38ce 100644 --- a/src/controller.ts +++ b/src/controller.ts @@ -93,24 +93,34 @@ export default class Controller { // @todo: Generate nice looking thank you page const output = ` - + + +
- -
+
+
` res.send(output) } catch (err: any) { + const message = err.message // @todo: Generate nice looking thank you page const output = `

Error

-

${err.message}

+

${message}

` From 21ffb36da578130d227fe6e6e7e5bb933f70a8eb Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 27 Jan 2024 13:53:46 +1030 Subject: [PATCH 32/33] Fix to handle sync token expiration properly --- src/providers/BaseProvider.ts | 38 ++++++++++++++++------------------- src/utils.ts | 2 -- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/providers/BaseProvider.ts b/src/providers/BaseProvider.ts index e79311ef..fd246e65 100644 --- a/src/providers/BaseProvider.ts +++ b/src/providers/BaseProvider.ts @@ -110,29 +110,25 @@ export default class BaseProvider { * @returns */ public async sync(accessToken: string, refreshToken: string, syncSchemas: Record = {}): Promise { - try { - const api = await this.getApi(accessToken, refreshToken) - const results = [] - - const handlers = this.syncHandlers() - const schemaList = Object.keys(syncSchemas) - for (let h in handlers) { - const handler = handlers[h] - - if (schemaList.length && schemaList.indexOf(handler.getSchemaUri()) === -1) { - // Schema list exists, but not found - continue - } - - const handlerInstance = new handler(this.config, this.profile) - const handlerResults = await handlerInstance.sync(api, syncSchemas[handler.getSchemaUri()]) - results[handler.getSchemaUri()] = handlerResults - } + const api = await this.getApi(accessToken, refreshToken) + const results = [] + + const handlers = this.syncHandlers() + const schemaList = Object.keys(syncSchemas) + for (let h in handlers) { + const handler = handlers[h] - return results - } catch (err) { - console.log(err) + if (schemaList.length && schemaList.indexOf(handler.getSchemaUri()) === -1) { + // Schema list exists, but not found + continue + } + + const handlerInstance = new handler(this.config, this.profile) + const handlerResults = await handlerInstance.sync(api, syncSchemas[handler.getSchemaUri()]) + results[handler.getSchemaUri()] = handlerResults } + + return results } // Set new authentication credentials for this provider instance, if they changed diff --git a/src/utils.ts b/src/utils.ts index c299a5b9..8002c4f2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -8,7 +8,6 @@ import serverconfig from '../src/serverconfig.json' const CONTEXT_NAME = serverconfig.verida.contextName const PRIVATE_KEY = serverconfig.verida.privateKey -const DEFAULT_ENDPOINTS = serverconfig.verida.defaultEndpoints const DID_CLIENT_CONFIG = serverconfig.verida.didClientConfig const SBT_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/token/sbt/credential/v0.1.0/schema.json' @@ -16,7 +15,6 @@ const SBT_CREDENTIAL_SCHEMA = 'https://common.schemas.verida.io/token/sbt/creden export { CONTEXT_NAME, PRIVATE_KEY, - DEFAULT_ENDPOINTS, DID_CLIENT_CONFIG, SBT_CREDENTIAL_SCHEMA } From da3da0591519de6b0cf79b3479e8ccc9ab63c7ab Mon Sep 17 00:00:00 2001 From: Chris Date: Sat, 27 Jan 2024 13:54:34 +1030 Subject: [PATCH 33/33] Fix Discord implementation --- src/providers/discord/following.ts | 60 ++++++++++++++++++++++++++++++ src/providers/discord/index.ts | 14 +++++-- 2 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/providers/discord/following.ts diff --git a/src/providers/discord/following.ts b/src/providers/discord/following.ts new file mode 100644 index 00000000..2d750ff0 --- /dev/null +++ b/src/providers/discord/following.ts @@ -0,0 +1,60 @@ +import BaseSyncHandler from "../BaseSyncHandler" +import dayjs from 'dayjs' +import { SyncSchemaConfig } from "../BaseProvider" +const _ = require('lodash') + +const log4js = require("log4js") +const logger = log4js.getLogger() + +//import { Client } from 'discord.js' + +export default class Following extends BaseSyncHandler { + + protected static schemaUri: string = 'https://common.schemas.verida.io/social/following/v0.1.0/schema.json' + + /** + * @todo: Support paging through all results + * @todo: Correctly support `this.config.limitResults` + * + * @param api + */ + public async sync(api: any, syncConfig: SyncSchemaConfig = {}): Promise { + const guildResponse: any = await api.get('/users/@me/guilds') + console.log(syncConfig) + + const now = (new Date()).toISOString() + const guilds: any = [] + for (let i in guildResponse) { + try { + const guildItem = guildResponse[i] + console.log('Processing', guildItem.name) + /* + Note: It's not possible to fetch followedTimestamp. It appears Discord rate limiting is + really extreme and only allows 5 requests per minute. + + const guildMemberInfo = await api.get(`/users/@me/guilds/${guildItem.id}/member`) + const followedTimestamp = guildMemberInfo.joined_at + */ + + const guildIcon = api.cdn.icon(guildItem.id, guildItem.icon) + const guildEntry: any = { + _id: `discord-${guildItem.id}`, + name: guildItem.name, + icon: guildIcon, + summary: `Discord guild: ${guildItem.name}`, + //uri: Discord doesn't support URL's for servers + sourceApplication: 'https://discord.com/', + sourceId: guildItem.id, + //followedTimestamp: now, + insertedAt: now + } + + guilds.push(guildEntry) + } catch (err) { + console.log(err) + } + } + + return guilds + } +} \ No newline at end of file diff --git a/src/providers/discord/index.ts b/src/providers/discord/index.ts index 7c7e5a83..b9771de7 100644 --- a/src/providers/discord/index.ts +++ b/src/providers/discord/index.ts @@ -4,12 +4,13 @@ import BaseProviderConfig from '../BaseProviderConfig' const passport = require("passport") import { Strategy as DiscordStrategy, Scope } from '@oauth-everything/passport-discord'; -import { REST } from 'discord.js' +import { REST, Client, GatewayIntentBits } from 'discord.js' import { DiscordSnowflake } from '@sapphire/snowflake' import dayjs from 'dayjs' import axios from 'axios' -import SBTs from './sbts' +//import SBTs from './sbts' +import Following from './following' import TokenExpiredError from '../TokenExpiredError' export interface DiscordProviderConfig extends BaseProviderConfig { @@ -37,6 +38,7 @@ export default class DiscordProvider extends Base { public syncHandlers(): any[] { return [ //SBTs + Following ] return [] } @@ -94,6 +96,7 @@ export default class DiscordProvider extends Base { } catch (err: any) { if (err.status && (err.status == 401 || err.status == 403)) { console.log('token has expired, fetch a new one') + console.log('refreshToken', refreshToken) try { const requestData = { @@ -102,7 +105,11 @@ export default class DiscordProvider extends Base { grant_type: 'refresh_token', refresh_token: refreshToken } - const newTokenResponse = await axios.post('https://discord.com/api/v10/oauth2/token', requestData, { + const newTokenResponse = await axios.post('https://discord.com/api/v10/oauth2/token', new URLSearchParams(requestData).toString(), { + auth: { + username: this.config.clientID, + password: this.config.clientSecret + }, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } @@ -114,6 +121,7 @@ export default class DiscordProvider extends Base { client = new REST({ version: '10', authPrefix: 'Bearer' }).setToken(access_token); me = await client.get('/users/@me') } catch (err) { + console.log(err.response) // Unrecoverable auth error throw new TokenExpiredError(err.message) }