diff --git a/integration/ocean/Signature.test.ts b/integration/ocean/Signature.test.ts index f9afbaf..64ed982 100644 --- a/integration/ocean/Signature.test.ts +++ b/integration/ocean/Signature.test.ts @@ -5,14 +5,11 @@ import { config } from "../config" import { Ocean, Account, DDO } from "../../src" // @oceanprotocol/squid -import ServiceAgreement from "../../src/ocean/ServiceAgreements/ServiceAgreement" - // WARN: not integration test. It has been done here because constant values // depends on the first account on spree (only accessible from integration test) describe("Signature", () => { let ocean: Ocean - let web3: Web3 let consumer: Account before(async () => { @@ -21,7 +18,6 @@ describe("Signature", () => { web3Provider: new (Web3 as any).providers .HttpProvider("http://localhost:8545", 0, "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", "node0"), }) - web3 = (ocean as any).web3 // Accounts consumer = new Account("0x00bd138abd70e2f00903268f3db08f2d25677c9e") @@ -36,7 +32,7 @@ describe("Signature", () => { const lockId = `0x${"b".repeat(64)}` const escrowId = `0x${"c".repeat(64)}` - const hash = await ServiceAgreement.hashServiceAgreement( + const hash = await ocean.utils.agreements.hashServiceAgreement( templateId, agreementId, [accessId, lockId, escrowId], @@ -82,8 +78,7 @@ describe("Signature", () => { const agreementConditionIds = await templates.escrowAccessSecretStoreTemplate .getAgreementIdsFromDDO(agreementId, ddo, consumer.getId(), consumer.getId()) - const signature = await ServiceAgreement.signServiceAgreement( - web3, + const signature = await ocean.utils.agreements.signServiceAgreement( ddo, serviceDefinitionId, agreementId, diff --git a/package-lock.json b/package-lock.json index fab9e1f..f5abc36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -129,9 +129,9 @@ } }, "@oceanprotocol/keeper-contracts": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@oceanprotocol/keeper-contracts/-/keeper-contracts-0.8.5.tgz", - "integrity": "sha512-GRVsKAAX60PikLyeA6SEPm1NKOPCHW5C225H4Cpe+hww+qEbGu7Y2/Y+svWSXzfxElUanRZBdZfiEx4tdudIoQ==" + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@oceanprotocol/keeper-contracts/-/keeper-contracts-0.8.6.tgz", + "integrity": "sha512-WdIDedXZSS+AG3/K+issOJQ4Jmg0UtdNPpi1Ogo+sFogmYIa21m06pqvuAKK8tGG2o+KBW8nBUMyyA3mR2j+vg==" }, "@oceanprotocol/secret-store-client": { "version": "0.0.14", @@ -1158,12 +1158,6 @@ "unset-value": "^1.0.0" } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1250,12 +1244,6 @@ "safe-buffer": "^5.0.1" } }, - "circular-json": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1581,15 +1569,6 @@ "ms": "2.0.0" } }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -2122,34 +2101,6 @@ "safe-buffer": "^5.1.1" } }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2626,7 +2577,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2647,12 +2599,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2673,12 +2627,14 @@ "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2795,7 +2751,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2822,6 +2779,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2829,12 +2787,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2853,6 +2813,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2946,6 +2907,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3031,7 +2993,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3067,6 +3030,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3086,6 +3050,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3129,12 +3094,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -3597,12 +3564,6 @@ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", @@ -4065,15 +4026,6 @@ "readable-stream": "^2.0.5" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, "lcov-result-merger": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.1.0.tgz", @@ -4137,16 +4089,6 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -4219,15 +4161,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -4296,12 +4229,6 @@ "mime-db": "~1.38.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -4443,28 +4370,6 @@ } } }, - "mocha-parallel-tests": { - "version": "2.0.6-alpha.3", - "resolved": "https://registry.npmjs.org/mocha-parallel-tests/-/mocha-parallel-tests-2.0.6-alpha.3.tgz", - "integrity": "sha512-yyCObs84loUFbLim3KfeucKeSULudEoDNbOsNuJ/hdwj1vsIVr1bs1Tsk30OAMCpSdi7vUhvU9uIO8nJ3t62FQ==", - "dev": true, - "requires": { - "circular-json": "^0.5.4", - "debug": "3.1.0", - "yargs": "12.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "mock-fs": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz", @@ -5822,17 +5727,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -6086,12 +5980,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", @@ -8207,7 +8095,7 @@ "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.37", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" + "websocket": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" } }, "web3-shh": { @@ -8611,12 +8499,6 @@ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -8633,41 +8515,6 @@ "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz", - "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index f7432a8..3d21a92 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ }, "homepage": "https://github.com/oceanprotocol/squid-js#readme", "dependencies": { - "@oceanprotocol/keeper-contracts": "^0.8.5", + "@oceanprotocol/keeper-contracts": "^0.8.6", "@oceanprotocol/secret-store-client": "~0.0.14", "bignumber.js": "^8.0.1", "deprecated-decorator": "^0.1.6", diff --git a/src/ddo/DDO.ts b/src/ddo/DDO.ts index 79f2552..909757b 100644 --- a/src/ddo/DDO.ts +++ b/src/ddo/DDO.ts @@ -1,7 +1,7 @@ import * as Web3 from "web3" import Web3Provider from "../keeper/Web3Provider" import LoggerInstance from "../utils/Logger" -import * as signatureHelpers from "../utils/SignatureHelpers" +import { Ocean } from "../ocean/Ocean" import { Authentication } from "./Authentication" import { Proof } from "./Proof" import { PublicKey } from "./PublicKey" @@ -112,10 +112,10 @@ export class DDO { * @param {string} password Password if it's requirted. * @return {Promise} Proof object. */ - public async generateProof(web3: Web3, publicKey: string, password?: string): Promise { + public async generateProof(ocean: Ocean, publicKey: string, password?: string): Promise { const checksum = this.getChecksum() - const signature = await signatureHelpers.signText(web3, checksum, publicKey, password) + const signature = await ocean.utils.signature.signText(checksum, publicKey, password) return { created: (new Date()).toISOString(), diff --git a/src/ocean/Ocean.ts b/src/ocean/Ocean.ts index 64c5676..e6c78ee 100644 --- a/src/ocean/Ocean.ts +++ b/src/ocean/Ocean.ts @@ -3,6 +3,7 @@ import { OceanAgreements } from "./OceanAgreements" import { OceanAssets } from "./OceanAssets" import { OceanSecretStore } from "./OceanSecretStore" import { OceanTokens } from "./OceanTokens" +import { OceanUtils } from "./utils/OceanUtils" import { Aquarius } from "../aquarius/Aquarius" import { Brizo } from "../brizo/Brizo" @@ -43,6 +44,8 @@ export class Ocean extends Instantiable { instance.secretStore = await OceanSecretStore.getInstance(instanceConfig) instance.tokens = await OceanTokens.getInstance(instanceConfig) + instance.utils = await OceanUtils.getInstance(instanceConfig) + return instance } @@ -94,6 +97,12 @@ export class Ocean extends Instantiable { */ public tokens: OceanTokens + /** + * Ocean utils submodule + * @type {OceanUtils} + */ + public utils: OceanUtils + private constructor() { super() } diff --git a/src/ocean/OceanAgreements.ts b/src/ocean/OceanAgreements.ts index e137742..d3dd405 100644 --- a/src/ocean/OceanAgreements.ts +++ b/src/ocean/OceanAgreements.ts @@ -1,7 +1,6 @@ import { generateId } from "../utils/GeneratorHelpers" import Account from "./Account" import DID from "./DID" -import ServiceAgreement from "./ServiceAgreements/ServiceAgreement" import { zeroX, didPrefixed } from "../utils" import { Instantiable, InstantiableConfig } from "../Instantiable.abstract" @@ -57,8 +56,7 @@ export class OceanAgreements extends Instantiable { .getTemplateByName(templateName) .getAgreementIdsFromDDO(agreementId, ddo, consumer.getId(), consumer.getId()) - const signature = await ServiceAgreement.signServiceAgreement( - this.web3, + const signature = await this.ocean.utils.agreements.signServiceAgreement( ddo, serviceDefinitionId, agreementId, diff --git a/src/ocean/OceanAssets.ts b/src/ocean/OceanAssets.ts index 198629a..6f989d5 100644 --- a/src/ocean/OceanAssets.ts +++ b/src/ocean/OceanAssets.ts @@ -135,7 +135,7 @@ export class OceanAssets extends Instantiable { serviceAgreementTemplate.conditions = conditions ddo.addChecksum() - await ddo.addProof(this.web3, publisher.getId(), publisher.getPassword()) + await ddo.addProof(this.ocean, publisher.getId(), publisher.getPassword()) const storedDdo = await this.ocean.aquarius.storeDDO(ddo) await didRegistry.registerAttribute( diff --git a/src/ocean/utils/OceanUtils.ts b/src/ocean/utils/OceanUtils.ts new file mode 100644 index 0000000..5b7d6df --- /dev/null +++ b/src/ocean/utils/OceanUtils.ts @@ -0,0 +1,36 @@ +import { Instantiable, InstantiableConfig } from "../../Instantiable.abstract" + +import { ServiceAgreement } from "./ServiceAgreement" +import { SignatureUtils } from "./SignatureUtils" + +/** + * Utils internal submodule of Ocean Protocol. + */ +export class OceanUtils extends Instantiable { + + /** + * Returns the instance of OceanUtils. + * @return {Promise} + */ + public static async getInstance(config: InstantiableConfig): Promise { + const instance = new OceanUtils() + instance.setInstanceConfig(config) + + instance.agreements = new ServiceAgreement(config) + instance.signature = new SignatureUtils(config) + + return instance + } + + /** + * Agreement utils. + * @type {ServiceAgreement} + */ + public agreements: ServiceAgreement + + /** + * Signature utils. + * @type {SignatureUtils} + */ + public signature: SignatureUtils +} diff --git a/src/ocean/ServiceAgreements/ServiceAgreement.ts b/src/ocean/utils/ServiceAgreement.ts similarity index 61% rename from src/ocean/ServiceAgreements/ServiceAgreement.ts rename to src/ocean/utils/ServiceAgreement.ts index 0b301d3..3de46a2 100644 --- a/src/ocean/ServiceAgreements/ServiceAgreement.ts +++ b/src/ocean/utils/ServiceAgreement.ts @@ -2,16 +2,18 @@ import * as Web3 from "web3" import { ServiceAgreementTemplateCondition } from "../../ddo/ServiceAgreementTemplate" import { DDO } from "../../ddo/DDO" import { ServiceAccess } from "../../ddo/Service" -import LoggerInstance from "../../utils/Logger" -import Web3Provider from "../../keeper/Web3Provider" import Account from "../Account" -import { signText, zeroX } from "../../utils" +import { zeroX } from "../../utils" +import { Instantiable, InstantiableConfig } from "../../Instantiable.abstract" -// TODO: move this class to helpers, it only contains pure functions -export default class ServiceAgreement { +export class ServiceAgreement extends Instantiable { - public static async signServiceAgreement( - web3: Web3, + constructor(config: InstantiableConfig) { + super() + this.setInstanceConfig(config) + } + + public async signServiceAgreement( ddo: DDO, serviceDefinitionId: string, serviceAgreementId: string, @@ -20,15 +22,14 @@ export default class ServiceAgreement { ): Promise { const service = ddo.findServiceById<"Access">(serviceDefinitionId) - const timelockValues: number[] = ServiceAgreement.getTimeValuesFromService(service, "timelock") - const timeoutValues: number[] = ServiceAgreement.getTimeValuesFromService(service, "timeout") + const timelockValues: number[] = this.getTimeValuesFromService(service, "timelock") + const timeoutValues: number[] = this.getTimeValuesFromService(service, "timeout") if (!service.templateId) { throw new Error("TemplateId not found in DDO.") } - const serviceAgreementHashSignature = await ServiceAgreement.createHashSignature( - web3, + const serviceAgreementHashSignature = await this.createHashSignature( service.templateId, serviceAgreementId, agreementConditionsIds, @@ -37,13 +38,12 @@ export default class ServiceAgreement { consumer, ) - LoggerInstance.log("SA hash signature:", serviceAgreementHashSignature) + this.logger.debug("SA hash signature:", serviceAgreementHashSignature) return serviceAgreementHashSignature } - public static async createHashSignature( - web3: Web3, + public async createHashSignature( templateId: string, serviceAgreementId: string, valueHashes: string[], @@ -52,7 +52,7 @@ export default class ServiceAgreement { consumer: Account, ): Promise { - const serviceAgreementHash = ServiceAgreement.hashServiceAgreement( + const serviceAgreementHash = this.hashServiceAgreement( templateId, serviceAgreementId, valueHashes, @@ -60,12 +60,13 @@ export default class ServiceAgreement { timeoutValues, ) - const serviceAgreementHashSignature = await signText(web3, serviceAgreementHash, consumer.getId(), consumer.getPassword()) + const serviceAgreementHashSignature = await this.ocean.utils.signature + .signText(serviceAgreementHash, consumer.getId(), consumer.getPassword()) return serviceAgreementHashSignature } - public static hashServiceAgreement( + public hashServiceAgreement( serviceAgreementTemplateId: string, serviceAgreementId: string, valueHashes: string[], @@ -81,10 +82,10 @@ export default class ServiceAgreement { {type: "bytes32", value: zeroX(serviceAgreementId)}, ] - return (Web3Provider as any).getWeb3().utils.soliditySha3(...args).toString("hex") + return this.web3.utils.soliditySha3(...args).toString("hex") } - private static getTimeValuesFromService(service: ServiceAccess, type: "timeout" | "timelock"): number[] { + private getTimeValuesFromService(service: ServiceAccess, type: "timeout" | "timelock"): number[] { const timeoutValues: number[] = service.serviceAgreementTemplate.conditions .map((condition: ServiceAgreementTemplateCondition) => condition[type]) diff --git a/src/ocean/utils/SignatureUtils.ts b/src/ocean/utils/SignatureUtils.ts new file mode 100644 index 0000000..c642aa3 --- /dev/null +++ b/src/ocean/utils/SignatureUtils.ts @@ -0,0 +1,31 @@ +import * as Web3 from "web3" + +import { Instantiable, InstantiableConfig } from "../../Instantiable.abstract" + +export class SignatureUtils extends Instantiable { + + constructor(config: InstantiableConfig) { + super() + this.setInstanceConfig(config) + } + + public async signText(text: string, publicKey: string, password?: string): Promise { + try { + return await this.web3.eth.personal.sign(text, publicKey, password) + } catch (e) { + this.logger.warn("Error on personal sign.") + this.logger.warn(e) + try { + return await this.web3.eth.sign(text, publicKey, password) + } catch (e2) { + this.logger.error("Error on sign.") + this.logger.error(e2) + throw new Error("Error executing personal sign") + } + } + } + + public async verifyText(text: string, signature: string): Promise { + return await this.web3.eth.personal.ecRecover(text, signature) + } +} diff --git a/src/utils/SignatureHelpers.ts b/src/utils/SignatureHelpers.ts deleted file mode 100644 index d2010b2..0000000 --- a/src/utils/SignatureHelpers.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as Web3 from "web3" -import LoggerInstance from "./Logger" - -export async function signText(web3: Web3, text: string, publicKey: string, password?: string): Promise { - try { - return await web3.eth.personal.sign(text, publicKey, password) - } catch (e) { - LoggerInstance.error("Error on personal sign.") - LoggerInstance.error(e) - try { - return await web3.eth.sign(text, publicKey, password) - } catch (e2) { - LoggerInstance.error("Error on sign.") - LoggerInstance.error(e2) - throw new Error("Error executing personal sign") - } - } -} - -export async function verifyText(web3: Web3, text: string, signature: string): Promise { - return await web3.eth.personal.ecRecover(text, signature) -} diff --git a/src/utils/index.ts b/src/utils/index.ts index f766a2c..9abf108 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,4 @@ export * from "./Logger" -export * from "./SignatureHelpers" export * from "./ConversionTypeHelpers" export * from "./GeneratorHelpers" export * from "./DDOHelpers" diff --git a/test/ddo/DDO.test.ts b/test/ddo/DDO.test.ts index 5de2dea..1459913 100644 --- a/test/ddo/DDO.test.ts +++ b/test/ddo/DDO.test.ts @@ -4,7 +4,6 @@ import * as Web3 from "web3" import { DDO } from "../../src/ddo/DDO" import { Service } from "../../src/ddo/Service" -import * as signatureHelpers from "../../src/utils/SignatureHelpers" import { Ocean } from "../../src/ocean/Ocean" import config from "../config" import TestContractHandler from "../keeper/TestContractHandler" @@ -165,10 +164,12 @@ describe("DDO", () => { }) let web3: Web3 + let ocean: Ocean beforeEach(async () => { await TestContractHandler.prepareContracts() - web3 = (await Ocean.getInstance(config) as any).web3 + ocean = await Ocean.getInstance(config) + web3 = (ocean as any).web3 }) afterEach(() => { @@ -256,10 +257,10 @@ describe("DDO", () => { const signature = `0x${"a".repeat(130)}` it("should properly generate the proof", async () => { - const signTextSpy = spy.on(signatureHelpers, "signText", () => signature) + const signTextSpy = spy.on(ocean.utils.signature, "signText", () => signature) const ddo = new DDO(testDDO) const checksum = ddo.getChecksum() - const proof = await ddo.generateProof(web3, publicKey) + const proof = await ddo.generateProof(ocean, publicKey) assert.include(proof as any, { creator: publicKey, diff --git a/test/ocean/Ocean.test.ts b/test/ocean/Ocean.test.ts index 87d13e6..a1b7103 100644 --- a/test/ocean/Ocean.test.ts +++ b/test/ocean/Ocean.test.ts @@ -2,37 +2,27 @@ import { assert, spy, use } from "chai" import * as spies from "chai-spies" import { SearchQuery } from "../../src/aquarius/query/SearchQuery" -import { DDO } from "../../src/ddo/DDO" import Account from "../../src/ocean/Account" import { Ocean } from "../../src/ocean/Ocean" -import * as signatureHelpers from "../../src/utils/SignatureHelpers" import config from "../config" import TestContractHandler from "../keeper/TestContractHandler" -import { metadataMock } from "../testdata/MetaData" use(spies) let ocean: Ocean -let accounts: Account[] -let testPublisher: Account describe("Ocean", () => { - const metadata = metadataMock - - beforeEach(async () => { - spy.on(signatureHelpers, "signText", () => `0x${"a".repeat(130)}`) - }) - afterEach(() => { - spy.restore() - }) - before(async () => { await TestContractHandler.prepareContracts() ocean = await Ocean.getInstance(config) - accounts = await ocean.accounts.list() + }) - testPublisher = accounts[0] + beforeEach(async () => { + spy.on(ocean.utils.signature, "signText", () => `0x${"a".repeat(130)}`) + }) + afterEach(() => { + spy.restore() }) describe("#getInstance()", () => { diff --git a/test/ocean/ServiceAgreement.test.ts b/test/ocean/ServiceAgreement.test.ts deleted file mode 100644 index 1d06704..0000000 --- a/test/ocean/ServiceAgreement.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import {assert} from "chai" -import { DDO } from "../../src/ddo/DDO" -import Account from "../../src/ocean/Account" -import DID from "../../src/ocean/DID" -import { Ocean } from "../../src/ocean/Ocean" -import ServiceAgreement from "../../src/ocean/ServiceAgreements/ServiceAgreement" -import { generateId } from "../../src/utils/GeneratorHelpers" -import config from "../config" -import TestContractHandler from "../keeper/TestContractHandler" - -const did: DID = DID.generate() - -describe("ServiceAgreement", () => { - let ocean: Ocean - - let publisherAccount: Account - let consumerAccount: Account - - before(async () => { - await TestContractHandler.prepareContracts() - ocean = await Ocean.getInstance(config) - const accounts = await ocean.accounts.list() - - publisherAccount = accounts[1] - consumerAccount = accounts[2] - }) - - describe("#signServiceAgreement()", () => { - xit("should sign an service agreement", async () => { - // const ddo = new DDO({id: did.getDid(), service: [accessService]}) - // const serviceAgreementId: string = generateId() - - // const serviceAgreementSignature: string = await ServiceAgreement.signServiceAgreement(ddo, accessService.serviceDefinitionId, - // serviceAgreementId, consumerAccount) - - // assert(serviceAgreementSignature) - // assert(serviceAgreementSignature.startsWith("0x")) - // assert(serviceAgreementSignature.length === 132) - }) - }) -}) diff --git a/test/utils/SignatureHelpers.test.ts b/test/ocean/utils/SignatureUtils.test.ts similarity index 70% rename from test/utils/SignatureHelpers.test.ts rename to test/ocean/utils/SignatureUtils.test.ts index 2aa7a48..8891ed3 100644 --- a/test/utils/SignatureHelpers.test.ts +++ b/test/ocean/utils/SignatureUtils.test.ts @@ -1,17 +1,24 @@ import { assert, expect, spy, use } from "chai" import * as spies from "chai-spies" -import Web3Provider from "../../src/keeper/Web3Provider" -import { signText, verifyText } from "../../src/utils/SignatureHelpers" +import config from "../../config" + +import { Ocean } from "../../../src/ocean/Ocean" use(spies) -describe("SignatureHelpers", () => { +describe("SignatureUtils", () => { const publicKey = `0x${"a".repeat(40)}` const text = "0123456789abcde" const signature = `0x${"a".repeat(130)}` let web3 + let ocean: Ocean + + before(async () => { + ocean = await Ocean.getInstance(config) + web3 = (ocean as any).web3 + }) afterEach(() => { spy.restore() @@ -21,19 +28,18 @@ describe("SignatureHelpers", () => { let personalSignSpy beforeEach(() => { - web3 = Web3Provider.getWeb3() personalSignSpy = spy.on(web3.eth.personal, "sign", () => signature) }) it("should sign a text as expected", async () => { - const signed = await signText(web3, text, publicKey) + const signed = await ocean.utils.signature.signText(text, publicKey) assert.equal(signed, signature) expect(personalSignSpy).to.have.been.called.with(text, publicKey) }) it("should sign a text as expected using password", async () => { - const signed = await signText(web3, text, publicKey, "test") + const signed = await ocean.utils.signature.signText(text, publicKey, "test") assert.equal(signed, signature) expect(personalSignSpy).to.have.been.called.with(text, publicKey, "test") @@ -44,7 +50,7 @@ describe("SignatureHelpers", () => { it("should recover the privateKey of a signed message", async () => { const personalRecoverSpy = spy.on(web3.eth.personal, "ecRecover", () => publicKey) - const verifiedPublicKey = await verifyText(web3, text, signature) + const verifiedPublicKey = await ocean.utils.signature.verifyText(text, signature) assert.equal(publicKey, verifiedPublicKey) expect(personalRecoverSpy).to.have.been.called.with(text, signature)