Move helpers/utils that needs web3 or ocean instance to instantiable classes.

This commit is contained in:
Pedro Gutiérrez 2019-03-28 12:20:22 +01:00 committed by Pedro Gutiérrez
parent 0d7d56d1fe
commit a931fe5a42
16 changed files with 157 additions and 307 deletions

View File

@ -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,

211
package-lock.json generated
View File

@ -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",

View File

@ -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",

View File

@ -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>} Proof object.
*/
public async generateProof(web3: Web3, publicKey: string, password?: string): Promise<Proof> {
public async generateProof(ocean: Ocean, publicKey: string, password?: string): Promise<Proof> {
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(),

View File

@ -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()
}

View File

@ -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,

View File

@ -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(

View File

@ -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<OceanUtils>}
*/
public static async getInstance(config: InstantiableConfig): Promise<OceanUtils> {
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
}

View File

@ -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<string> {
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<string> {
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])

View File

@ -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<string> {
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<string> {
return await this.web3.eth.personal.ecRecover(text, signature)
}
}

View File

@ -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<string> {
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<string> {
return await web3.eth.personal.ecRecover(text, signature)
}

View File

@ -1,5 +1,4 @@
export * from "./Logger"
export * from "./SignatureHelpers"
export * from "./ConversionTypeHelpers"
export * from "./GeneratorHelpers"
export * from "./DDOHelpers"

View File

@ -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,

View File

@ -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()", () => {

View File

@ -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)
})
})
})

View File

@ -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)