diff --git a/package-lock.json b/package-lock.json index 4db3faf0..085485fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3038,7 +3038,7 @@ "node_modules/@oceanprotocol/contracts": { "name": "hardhat-project", "version": "v1.0.0-alpha.1", - "resolved": "git+ssh://git@github.com/oceanprotocol/contracts.git#25ca73bbe44bf6d1782e971b75a42e5ba65f197b", + "resolved": "git+ssh://git@github.com/oceanprotocol/contracts.git#36e8bf296163690a23cfe012c4468caba4504709", "dependencies": { "@openzeppelin/contracts": "^4.3.3", "@openzeppelin/test-helpers": "^0.5.15", @@ -3638,14 +3638,14 @@ } }, "node_modules/@truffle/contract": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.4.1.tgz", - "integrity": "sha512-KVpG9alKxdNzWOcRN97crZXXmmnnShq1SkM9hQN2fOckszzrmy6ctOhnZKNAb8tzfHBgODDCmiGQbTqaYizcrA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.4.2.tgz", + "integrity": "sha512-w/iyB5dZ3KnIuvX1dqD1Z1SWFahT9/nvA1VAsK+eIy+zvtI1phx365uV75LdIoyeBtR1GmbqAO4F7ZLSfjkP+w==", "dependencies": { "@ensdomains/ensjs": "^2.0.1", "@truffle/blockchain-utils": "^0.0.31", "@truffle/contract-schema": "^3.4.4", - "@truffle/debug-utils": "^6.0.2", + "@truffle/debug-utils": "^6.0.3", "@truffle/error": "^0.0.14", "@truffle/interface-adapter": "^0.5.8", "bignumber.js": "^7.2.1", @@ -3695,9 +3695,9 @@ } }, "node_modules/@truffle/contract/node_modules/@types/node": { - "version": "12.20.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.38.tgz", - "integrity": "sha512-NxmtBRGipjx1B225OeMdI+CQmLbYqvvmYbukDTJGDgzIDgPQ1EcjGmYxGhOk5hTBqeB558S6RgHSpq2iiqifAQ==" + "version": "12.20.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.41.tgz", + "integrity": "sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q==" }, "node_modules/@truffle/contract/node_modules/cacheable-request": { "version": "6.1.0", @@ -4133,16 +4133,16 @@ } }, "node_modules/@truffle/debug-utils": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.2.tgz", - "integrity": "sha512-gMZ2IHPS9cvWGinUwVMoZedOYJz4sSekUXGC5FQkBnR0XDVriPmuja4rdgXhkA9EFSqZdXu4JAL8IiEHp/1YIw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.3.tgz", + "integrity": "sha512-wxvZqvHIBw9wJHtSpUMJTku8sHpC0VbP0gLyV5+NVa/rn6CvVGtf0MyoDZGS4FDyhO1hui+bzzoQftoRy7jWyA==", "dependencies": { "@truffle/codec": "^0.11.21", "@trufflesuite/chromafi": "^2.2.2", "bn.js": "^5.1.3", "chalk": "^2.4.2", "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.2" + "highlightjs-solidity": "^2.0.3" } }, "node_modules/@truffle/debug-utils/node_modules/bn.js": { @@ -4230,9 +4230,9 @@ } }, "node_modules/@truffle/interface-adapter/node_modules/@types/node": { - "version": "12.20.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.38.tgz", - "integrity": "sha512-NxmtBRGipjx1B225OeMdI+CQmLbYqvvmYbukDTJGDgzIDgPQ1EcjGmYxGhOk5hTBqeB558S6RgHSpq2iiqifAQ==" + "version": "12.20.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.41.tgz", + "integrity": "sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q==" }, "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { "version": "9.0.2", @@ -7131,7 +7131,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -7142,7 +7141,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7151,7 +7149,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7422,9 +7419,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.0.tgz", - "integrity": "sha512-qsrbIwWSEEYOM7z616jAVgwhuDDtPLwZSpUsU3vyUkHYqKTf/uwOJBZg2V7lMurYWkpVlaVOxBrfX0Q3ppvjfg==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.2.tgz", + "integrity": "sha512-CmWHvSKn2vNL6p6StNp1EmMIfVY/pqn3JLAjfZQ8WZGPOlGoO92EkX9/Mk81i6GxvoPXjUqEQnpM3rJ5QxxIOg==", "hasInstallScript": true, "peer": true, "funding": { @@ -11231,104 +11228,7 @@ "bundleDependencies": [ "source-map-support", "yargs", - "ethereumjs-util", - "@types/bn.js", - "@types/node", - "@types/pbkdf2", - "@types/secp256k1", - "ansi-regex", - "ansi-styles", - "base-x", - "blakejs", - "bn.js", - "brorand", - "browserify-aes", - "bs58", - "bs58check", - "buffer-from", - "buffer-xor", - "camelcase", - "cipher-base", - "cliui", - "color-convert", - "color-name", - "create-hash", - "create-hmac", - "cross-spawn", - "decamelize", - "elliptic", - "emoji-regex", - "end-of-stream", - "ethereum-cryptography", - "ethjs-util", - "evp_bytestokey", - "execa", - "find-up", - "get-caller-file", - "get-stream", - "hash-base", - "hash.js", - "hmac-drbg", - "inherits", - "invert-kv", - "is-fullwidth-code-point", - "is-hex-prefixed", - "is-stream", - "isexe", - "keccak", - "lcid", - "locate-path", - "map-age-cleaner", - "md5.js", - "mem", - "mimic-fn", - "minimalistic-assert", - "minimalistic-crypto-utils", - "nice-try", - "node-addon-api", - "node-gyp-build", - "npm-run-path", - "once", - "os-locale", - "p-defer", - "p-finally", - "p-is-promise", - "p-limit", - "p-locate", - "p-try", - "path-exists", - "path-key", - "pbkdf2", - "pump", - "randombytes", - "readable-stream", - "require-directory", - "require-main-filename", - "ripemd160", - "rlp", - "safe-buffer", - "scrypt-js", - "secp256k1", - "semver", - "set-blocking", - "setimmediate", - "sha.js", - "shebang-command", - "shebang-regex", - "signal-exit", - "source-map", - "string_decoder", - "string-width", - "strip-ansi", - "strip-eof", - "strip-hex-prefix", - "util-deprecate", - "which", - "which-module", - "wrap-ansi", - "wrappy", - "y18n", - "yargs-parser" + "ethereumjs-util" ], "dependencies": { "ethereumjs-util": "6.2.1", @@ -12660,9 +12560,9 @@ } }, "node_modules/hardhat-contract-sizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.2.0.tgz", - "integrity": "sha512-H9YS935e9FE/gdiZN++/Eet34fkBHSLB4JpeOx7LMRZFneMM5WOrcIYE392hzG45FvA2Bfgw1jhoFi5/Ybr50w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.3.0.tgz", + "integrity": "sha512-hRUwn5PhNWPO1t0ehtlDhEtP8YzzwCB+NNEdt6p+ZQ2bnq9rSgAjMsybSeOYt/ohen3kH31Pqm0hK0ies5/1tA==", "dependencies": { "cli-table3": "^0.6.0", "colors": "^1.4.0" @@ -25465,7 +25365,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -25482,7 +25381,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -25491,7 +25389,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -25506,7 +25403,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -25517,14 +25413,12 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -25670,7 +25564,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -25701,7 +25594,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -25719,7 +25611,6 @@ "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, "engines": { "node": ">=10" } @@ -27854,7 +27745,7 @@ } }, "@oceanprotocol/contracts": { - "version": "git+ssh://git@github.com/oceanprotocol/contracts.git#25ca73bbe44bf6d1782e971b75a42e5ba65f197b", + "version": "git+ssh://git@github.com/oceanprotocol/contracts.git#36e8bf296163690a23cfe012c4468caba4504709", "from": "@oceanprotocol/contracts@github:oceanprotocol/contracts#v4main_postaudit", "requires": { "@openzeppelin/contracts": "^4.3.3", @@ -28384,14 +28275,14 @@ } }, "@truffle/contract": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.4.1.tgz", - "integrity": "sha512-KVpG9alKxdNzWOcRN97crZXXmmnnShq1SkM9hQN2fOckszzrmy6ctOhnZKNAb8tzfHBgODDCmiGQbTqaYizcrA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@truffle/contract/-/contract-4.4.2.tgz", + "integrity": "sha512-w/iyB5dZ3KnIuvX1dqD1Z1SWFahT9/nvA1VAsK+eIy+zvtI1phx365uV75LdIoyeBtR1GmbqAO4F7ZLSfjkP+w==", "requires": { "@ensdomains/ensjs": "^2.0.1", "@truffle/blockchain-utils": "^0.0.31", "@truffle/contract-schema": "^3.4.4", - "@truffle/debug-utils": "^6.0.2", + "@truffle/debug-utils": "^6.0.3", "@truffle/error": "^0.0.14", "@truffle/interface-adapter": "^0.5.8", "bignumber.js": "^7.2.1", @@ -28426,9 +28317,9 @@ } }, "@types/node": { - "version": "12.20.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.38.tgz", - "integrity": "sha512-NxmtBRGipjx1B225OeMdI+CQmLbYqvvmYbukDTJGDgzIDgPQ1EcjGmYxGhOk5hTBqeB558S6RgHSpq2iiqifAQ==" + "version": "12.20.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.41.tgz", + "integrity": "sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q==" }, "cacheable-request": { "version": "6.1.0", @@ -28792,16 +28683,16 @@ } }, "@truffle/debug-utils": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.2.tgz", - "integrity": "sha512-gMZ2IHPS9cvWGinUwVMoZedOYJz4sSekUXGC5FQkBnR0XDVriPmuja4rdgXhkA9EFSqZdXu4JAL8IiEHp/1YIw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.3.tgz", + "integrity": "sha512-wxvZqvHIBw9wJHtSpUMJTku8sHpC0VbP0gLyV5+NVa/rn6CvVGtf0MyoDZGS4FDyhO1hui+bzzoQftoRy7jWyA==", "requires": { "@truffle/codec": "^0.11.21", "@trufflesuite/chromafi": "^2.2.2", "bn.js": "^5.1.3", "chalk": "^2.4.2", "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.2" + "highlightjs-solidity": "^2.0.3" }, "dependencies": { "bn.js": { @@ -28887,9 +28778,9 @@ } }, "@types/node": { - "version": "12.20.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.38.tgz", - "integrity": "sha512-NxmtBRGipjx1B225OeMdI+CQmLbYqvvmYbukDTJGDgzIDgPQ1EcjGmYxGhOk5hTBqeB558S6RgHSpq2iiqifAQ==" + "version": "12.20.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.41.tgz", + "integrity": "sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q==" }, "bignumber.js": { "version": "9.0.2", @@ -31219,7 +31110,6 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -31229,14 +31119,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -31464,9 +31352,9 @@ } }, "core-js-pure": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.0.tgz", - "integrity": "sha512-qsrbIwWSEEYOM7z616jAVgwhuDDtPLwZSpUsU3vyUkHYqKTf/uwOJBZg2V7lMurYWkpVlaVOxBrfX0Q3ppvjfg==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.2.tgz", + "integrity": "sha512-CmWHvSKn2vNL6p6StNp1EmMIfVY/pqn3JLAjfZQ8WZGPOlGoO92EkX9/Mk81i6GxvoPXjUqEQnpM3rJ5QxxIOg==", "peer": true }, "core-util-is": { @@ -36087,9 +35975,9 @@ } }, "hardhat-contract-sizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.2.0.tgz", - "integrity": "sha512-H9YS935e9FE/gdiZN++/Eet34fkBHSLB4JpeOx7LMRZFneMM5WOrcIYE392hzG45FvA2Bfgw1jhoFi5/Ybr50w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.3.0.tgz", + "integrity": "sha512-hRUwn5PhNWPO1t0ehtlDhEtP8YzzwCB+NNEdt6p+ZQ2bnq9rSgAjMsybSeOYt/ohen3kH31Pqm0hK0ies5/1tA==", "requires": { "cli-table3": "^0.6.0", "colors": "^1.4.0" @@ -45447,7 +45335,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -45457,14 +45344,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -45473,7 +45358,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -45481,14 +45365,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -45615,8 +45497,7 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yaeti": { "version": "0.0.6", @@ -45638,7 +45519,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -45652,8 +45532,7 @@ "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index e17bd525..8a49675b 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "test:nftDt": "mocha --config=test/unit/.mocharc.json --node-env=test --exit 'test/unit/Nft.test.ts'", "test:factory": "mocha --config=test/unit/.mocharc.json --node-env=test --exit 'test/unit/NftFactory.test.ts'", "test:router": "mocha --config=test/unit/.mocharc.json --node-env=test --exit 'test/unit/pools/Router.test.ts'", + "test:publishAll": "mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/PublishFlows.test.ts'", "test:unit": "mocha --config=test/unit/.mocharc.json --node-env=test --exit 'test/unit/**/*.test.ts'", "test:unit:cover": "nyc --report-dir coverage/unit npm run test:unit", "test:integration": "mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/**/*.test.ts'", diff --git a/src/@types/DDO/Metadata.ts b/src/@types/DDO/Metadata.ts index 58d14641..4533a771 100644 --- a/src/@types/DDO/Metadata.ts +++ b/src/@types/DDO/Metadata.ts @@ -131,3 +131,16 @@ export interface Metadata { */ additionalInformation?: any } + +export interface MetadataProof { + validatorAddress?: string + r?: string + s?: string + v?: number +} +export interface ValidateMetadata { + valid: Boolean + errors?: Object + hash?: string + proof?: MetadataProof +} diff --git a/src/@types/DDO/Service.ts b/src/@types/DDO/Service.ts index c5b447b7..7df16857 100644 --- a/src/@types/DDO/Service.ts +++ b/src/@types/DDO/Service.ts @@ -121,9 +121,9 @@ export interface Service { /** * Describing how long the service can be used after consumption is initiated. - * @type {string} + * @type {number} */ - timeout: string + timeout: number /** * Service friendly name diff --git a/src/aquarius/Aquarius.ts b/src/aquarius/Aquarius.ts index 4cf189d0..e3a0dc48 100644 --- a/src/aquarius/Aquarius.ts +++ b/src/aquarius/Aquarius.ts @@ -1,5 +1,6 @@ import { LoggerInstance } from '../utils' -import { Asset, DDO } from '../@types/' +import { Asset, DDO, Metadata, ValidateMetadata } from '../@types/' +import { json } from 'stream/consumers' export class Aquarius { public aquariusURL @@ -43,9 +44,9 @@ export class Aquarius { /** * Blocks until Aqua will cache the did (or the update for that did) or timeouts + * @param {string} fetchMethod fetch client instance * @param {string} did DID of the asset. * @param {string} txid used when the did exists and we expect an update with that txid. - * @param {string} fetchMethod fetch client instance * @return {Promise} DDO of the asset. */ public async waitForAqua(fetchMethod: any, did: string, txid?: string): Promise { @@ -69,6 +70,42 @@ export class Aquarius { } while (tries < 100) return null } + + /** + * Validate DDO content + * @param {string} fetchMethod fetch client instance + * @param {DDO} ddo DID Descriptor Object content. + * @return {Promise}. + */ + public async validate(fetchMethod: any, ddo: DDO): Promise { + const status: ValidateMetadata = { + valid: false + } + let jsonResponse + try { + const path = this.aquariusURL + '/api/aquarius/assets/ddo/validate' + const response = await fetchMethod('POST', path, JSON.stringify(ddo), { + 'Content-Type': 'application/octet-stream' + }) + jsonResponse = await response.json() + if (response.status === 200) { + status.valid = true + status.hash = jsonResponse.hash + status.proof = { + validatorAddress: jsonResponse.publicKey, + r: jsonResponse.r[0], + s: jsonResponse.s[0], + v: jsonResponse.v + } + } else { + status.errors = jsonResponse + LoggerInstance.error('validate Metadata failed:', response.status, status.errors) + } + } catch (error) { + LoggerInstance.error('Error validating metadata: ', error) + } + return status + } } export default Aquarius diff --git a/src/tokens/NFT.ts b/src/tokens/NFT.ts index c622eeb2..ee750750 100644 --- a/src/tokens/NFT.ts +++ b/src/tokens/NFT.ts @@ -4,6 +4,7 @@ import { TransactionReceipt } from 'web3-eth' import defaultNftAbi from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' import { LoggerInstance, getFairGasPrice, generateDtName } from '../utils' import { Contract } from 'web3-eth-contract' +import { MetadataProof } from '../../src/@types' /** * ERC721 ROLES @@ -912,6 +913,7 @@ export class Nft { flags: string, data: string, metadataHash: string, + metadataProofs?: MetadataProof[], contractInstance?: Contract ): Promise { const nftContract = @@ -928,7 +930,7 @@ export class Nft { flags, data, metadataHash, - [] + metadataProofs ) .estimateGas({ from: metadataUpdater }, (err, estGas) => err ? gasLimitDefault : estGas @@ -955,14 +957,14 @@ export class Nft { metaDataDecryptorAddress: string, flags: string, data: string, - metadataHash: string + metadataHash: string, + metadataProofs?: MetadataProof[] ): Promise { const nftContract = new this.web3.eth.Contract(this.nftAbi, nftAddress) - + if (!metadataProofs) metadataProofs = [] if (!(await this.getNftPermissions(nftAddress, address)).updateMetadata) { throw new Error(`Caller is not Metadata updater`) } - const estGas = await this.estGasSetMetadata( nftAddress, address, @@ -972,6 +974,7 @@ export class Nft { flags, data, metadataHash, + metadataProofs, nftContract ) const trxReceipt = await nftContract.methods @@ -982,7 +985,7 @@ export class Nft { flags, data, metadataHash, - [] + metadataProofs ) .send({ from: address, diff --git a/test/integration/PublishFlows.test.ts b/test/integration/PublishFlows.test.ts new file mode 100644 index 00000000..e7364f7c --- /dev/null +++ b/test/integration/PublishFlows.test.ts @@ -0,0 +1,346 @@ +import MockERC20 from '@oceanprotocol/contracts/artifacts/contracts/utils/mock/MockERC20Decimals.sol/MockERC20Decimals.json' +import ProviderInstance from '../../src/provider/Provider' +import Aquarius from '../../src/aquarius/Aquarius' +import { assert } from 'chai' +import { NftFactory, NftCreateData } from '../../src/factories/index' +import { + Erc20CreateParams, + PoolCreationParams, + FreCreationParams, + DispenserCreationParams +} from '../../src/interfaces' +import { getHash, crossFetchGeneric, ZERO_ADDRESS } from '../../src/utils' +import { Nft } from '../../src/tokens/NFT' +import Web3 from 'web3' +import { SHA256 } from 'crypto-js' +import { homedir } from 'os' +import fs from 'fs' +import { AbiItem } from 'web3-utils' +import { ValidateMetadata, DDO } from '../../src/@types' + +const data = JSON.parse( + fs.readFileSync( + process.env.ADDRESS_FILE || + `${homedir}/.ocean/ocean-contracts/artifacts/address.json`, + 'utf8' + ) +) + +const addresses = data.development +console.log(addresses) +const aquarius = new Aquarius('http://127.0.0.1:5000') +const web3 = new Web3('http://127.0.0.1:8545') +const providerUrl = 'http://172.15.0.4:8030' +let nft: Nft +let factory: NftFactory +let accounts: string[] + +const files = [ + { + type: 'url', + url: 'https://raw.githubusercontent.com/oceanprotocol/testdatasets/main/shs_dataset_test.txt', + method: 'GET' + } +] +const genericAsset: DDO = { + '@context': ['https://w3id.org/did/v1'], + id: 'testFakeDid', + version: '4.0.0', + chainId: 4, + nftAddress: '0x0', + metadata: { + created: '2021-12-20T14:35:20Z', + updated: '2021-12-20T14:35:20Z', + name: 'dataset-name', + type: 'dataset', + description: 'Ocean protocol test dataset description', + author: 'oceanprotocol-team', + license: 'MIT', + tags: ['white-papers'], + additionalInformation: { 'test-key': 'test-value' }, + links: ['http://data.ceda.ac.uk/badc/ukcp09/'] + }, + services: [ + { + id: 'testFakeId', + type: 'access', + description: 'Download service', + files: '', + datatokenAddress: '0xa15024b732A8f2146423D14209eFd074e61964F3', + serviceEndpoint: 'https://providerv4.rinkeby.oceanprotocol.com', + timeout: 0 + } + ] +} + +describe('Publish tests', async () => { + it('initialise testes classes', async () => { + nft = new Nft(web3) + factory = new NftFactory(addresses.ERC721Factory, web3) + accounts = await web3.eth.getAccounts() + const daiContract = new web3.eth.Contract( + MockERC20.abi as AbiItem[], + addresses.MockDAI + ) + await daiContract.methods + .approve(addresses.ERC721Factory, web3.utils.toWei('100000')) + .send({ from: accounts[0] }) + }) + + it('should publish a dataset with pool (create NFT + ERC20 + pool) and with Metdata proof', async () => { + const poolDdo: DDO = { ...genericAsset } + const nftParams: NftCreateData = { + name: 'testNftPool', + symbol: 'TSTP', + templateIndex: 1, + tokenURI: '' + } + const erc20Params: Erc20CreateParams = { + templateIndex: 1, + cap: '100000', + feeAmount: '0', + feeManager: ZERO_ADDRESS, + feeToken: ZERO_ADDRESS, + minter: accounts[0], + mpFeeAddress: ZERO_ADDRESS + } + const poolParams: PoolCreationParams = { + ssContract: addresses.Staking, + basetokenAddress: addresses.MockDAI, + basetokenSender: addresses.ERC721Factory, + publisherAddress: accounts[0], + marketFeeCollector: accounts[0], + poolTemplateAddress: addresses.poolTemplate, + rate: '1', + basetokenDecimals: 18, + vestingAmount: '10000', + vestedBlocks: 2500000, + initialBasetokenLiquidity: '2000', + swapFeeLiquidityProvider: 1e15, + swapFeeMarketRunner: 1e15 + } + const bundleNFT = await factory.createNftErcWithPool( + accounts[0], + nftParams, + erc20Params, + poolParams + ) + + const nftAddress = bundleNFT.events.NFTCreated.returnValues[0] + const datatokenAddress = bundleNFT.events.TokenCreated.returnValues[0] + const poolAdress = bundleNFT.events.NewPool.returnValues[0] + + const encryptedFiles = await ProviderInstance.encrypt( + files, + providerUrl, + crossFetchGeneric + ) + + poolDdo.metadata.name = 'test-dataset-pool' + poolDdo.services[0].files = await encryptedFiles.text() + poolDdo.services[0].datatokenAddress = datatokenAddress + + poolDdo.nftAddress = nftAddress + const chain = await web3.eth.getChainId() + poolDdo.chainId = chain + poolDdo.id = + 'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10)) + + const AssetValidation: ValidateMetadata = await aquarius.validate( + crossFetchGeneric, + poolDdo + ) + assert(AssetValidation.valid === true, 'Published asset is not valid') + + const encryptedDdo = await ProviderInstance.encrypt( + poolDdo, + providerUrl, + crossFetchGeneric + ) + const encryptedResponse = await encryptedDdo.text() + const metadataHash = getHash(JSON.stringify(poolDdo)) + // just to make sure that our hash matches one computed by aquarius + assert(AssetValidation.hash === '0x' + metadataHash, 'Metadata hash is a missmatch') + const tx = await nft.setMetadata( + nftAddress, + accounts[0], + 0, + providerUrl, + '', + '0x2', + encryptedResponse, + '0x' + metadataHash, + [AssetValidation.proof] + ) + + const resolvedDDO = await aquarius.waitForAqua(crossFetchGeneric, poolDdo.id) + assert(resolvedDDO, 'Cannot fetch DDO from Aquarius') + }) + + it('should publish a dataset with fixed price (create NFT + ERC20 + fixed price) with an explicit empty Metadata Proof', async () => { + const fixedPriceDdo: DDO = { ...genericAsset } + const nftParams: NftCreateData = { + name: 'testNftFre', + symbol: 'TSTF', + templateIndex: 1, + tokenURI: '' + } + const erc20Params: Erc20CreateParams = { + templateIndex: 1, + cap: '100000', + feeAmount: '0', + feeManager: ZERO_ADDRESS, + feeToken: ZERO_ADDRESS, + minter: accounts[0], + mpFeeAddress: ZERO_ADDRESS + } + + const fixedPriceParams: FreCreationParams = { + fixedRateAddress: addresses.FixedPrice, + baseTokenAddress: addresses.MockDAI, + owner: accounts[0], + marketFeeCollector: accounts[0], + baseTokenDecimals: 18, + dataTokenDecimals: 18, + fixedRate: '1', + marketFee: 1e15, + allowedConsumer: accounts[0], + withMint: false + } + + const bundleNFT = await factory.createNftErcWithFixedRate( + accounts[0], + nftParams, + erc20Params, + fixedPriceParams + ) + + const nftAddress = bundleNFT.events.NFTCreated.returnValues[0] + const datatokenAddress = bundleNFT.events.TokenCreated.returnValues[0] + const fixedPrice = bundleNFT.events.NewFixedRate.returnValues[0] + + const encryptedFiles = await ProviderInstance.encrypt( + files, + providerUrl, + crossFetchGeneric + ) + + fixedPriceDdo.metadata.name = 'test-dataset-fixedPrice' + fixedPriceDdo.services[0].files = await encryptedFiles.text() + fixedPriceDdo.services[0].datatokenAddress = datatokenAddress + + fixedPriceDdo.nftAddress = nftAddress + const chain = await web3.eth.getChainId() + fixedPriceDdo.chainId = chain + fixedPriceDdo.id = + 'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10)) + + const isAssetValid: ValidateMetadata = await aquarius.validate( + crossFetchGeneric, + fixedPriceDdo + ) + assert(isAssetValid.valid === true, 'Published asset is not valid') + + const encryptedDdo = await ProviderInstance.encrypt( + fixedPriceDdo, + providerUrl, + crossFetchGeneric + ) + const encryptedResponse = await encryptedDdo.text() + const metadataHash = getHash(JSON.stringify(fixedPriceDdo)) + // this is publishing with an explicit empty metadataProofs + const res = await nft.setMetadata( + nftAddress, + accounts[0], + 0, + providerUrl, + '', + '0x2', + encryptedResponse, + '0x' + metadataHash, + [] + ) + const resolvedDDO = await aquarius.waitForAqua(crossFetchGeneric, fixedPriceDdo.id) + assert(resolvedDDO, 'Cannot fetch DDO from Aquarius') + }) + + it('should publish a dataset with dispenser (create NFT + ERC20 + dispenser) with no defined MetadataProof', async () => { + const dispenserDdo: DDO = { ...genericAsset } + const nftParams: NftCreateData = { + name: 'testNftDispenser', + symbol: 'TSTD', + templateIndex: 1, + tokenURI: '' + } + const erc20Params: Erc20CreateParams = { + templateIndex: 1, + cap: '100000', + feeAmount: '0', + feeManager: ZERO_ADDRESS, + feeToken: ZERO_ADDRESS, + minter: accounts[0], + mpFeeAddress: ZERO_ADDRESS + } + + const dispenserParams: DispenserCreationParams = { + dispenserAddress: addresses.Dispenser, + maxTokens: web3.utils.toWei('1'), + maxBalance: web3.utils.toWei('1'), + withMint: true, + allowedSwapper: ZERO_ADDRESS + } + + const bundleNFT = await factory.createNftErcWithDispenser( + accounts[0], + nftParams, + erc20Params, + dispenserParams + ) + + const nftAddress = bundleNFT.events.NFTCreated.returnValues[0] + const datatokenAddress = bundleNFT.events.TokenCreated.returnValues[0] + const dispenserAddress = bundleNFT.events.DispenserCreated.returnValues[0] + + const encryptedFiles = await ProviderInstance.encrypt( + files, + providerUrl, + crossFetchGeneric + ) + dispenserDdo.metadata.name = 'test-dataset-dispenser' + dispenserDdo.services[0].files = await encryptedFiles.text() + dispenserDdo.services[0].datatokenAddress = datatokenAddress + + dispenserDdo.nftAddress = nftAddress + const chain = await web3.eth.getChainId() + dispenserDdo.chainId = chain + dispenserDdo.id = + 'did:op:' + SHA256(web3.utils.toChecksumAddress(nftAddress) + chain.toString(10)) + + const isAssetValid: ValidateMetadata = await aquarius.validate( + crossFetchGeneric, + dispenserDdo + ) + assert(isAssetValid.valid === true, 'Published asset is not valid') + + const encryptedDdo = await ProviderInstance.encrypt( + dispenserDdo, + providerUrl, + crossFetchGeneric + ) + const encryptedResponse = await encryptedDdo.text() + const metadataHash = getHash(JSON.stringify(dispenserDdo)) + // this is publishing with any explicit metadataProofs + const res = await nft.setMetadata( + nftAddress, + accounts[0], + 0, + providerUrl, + '', + '0x2', + encryptedResponse, + '0x' + metadataHash + ) + const resolvedDDO = await aquarius.waitForAqua(crossFetchGeneric, dispenserDdo.id) + assert(resolvedDDO, 'Cannot fetch DDO from Aquarius') + }) +}) diff --git a/test/integration/SimplePublishConsumeFlow.test.ts b/test/integration/SimplePublishConsumeFlow.test.ts index 337fa572..fdfe14b6 100644 --- a/test/integration/SimplePublishConsumeFlow.test.ts +++ b/test/integration/SimplePublishConsumeFlow.test.ts @@ -65,7 +65,7 @@ const ddo = { ] } -describe('Publish tests', async () => { +describe('Simple Publish & consume test', async () => { it('should publish a dataset (create NFT + ERC20)', async () => { const nft = new Nft(web3) const datatoken = new Datatoken(web3)