1
0
mirror of https://github.com/oceanprotocol-archive/squid-js.git synced 2024-02-02 15:31:51 +01:00

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 { 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 // WARN: not integration test. It has been done here because constant values
// depends on the first account on spree (only accessible from integration test) // depends on the first account on spree (only accessible from integration test)
describe("Signature", () => { describe("Signature", () => {
let ocean: Ocean let ocean: Ocean
let web3: Web3
let consumer: Account let consumer: Account
before(async () => { before(async () => {
@ -21,7 +18,6 @@ describe("Signature", () => {
web3Provider: new (Web3 as any).providers web3Provider: new (Web3 as any).providers
.HttpProvider("http://localhost:8545", 0, "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", "node0"), .HttpProvider("http://localhost:8545", 0, "0x00Bd138aBD70e2F00903268F3Db08f2D25677C9e", "node0"),
}) })
web3 = (ocean as any).web3
// Accounts // Accounts
consumer = new Account("0x00bd138abd70e2f00903268f3db08f2d25677c9e") consumer = new Account("0x00bd138abd70e2f00903268f3db08f2d25677c9e")
@ -36,7 +32,7 @@ describe("Signature", () => {
const lockId = `0x${"b".repeat(64)}` const lockId = `0x${"b".repeat(64)}`
const escrowId = `0x${"c".repeat(64)}` const escrowId = `0x${"c".repeat(64)}`
const hash = await ServiceAgreement.hashServiceAgreement( const hash = await ocean.utils.agreements.hashServiceAgreement(
templateId, templateId,
agreementId, agreementId,
[accessId, lockId, escrowId], [accessId, lockId, escrowId],
@ -82,8 +78,7 @@ describe("Signature", () => {
const agreementConditionIds = await templates.escrowAccessSecretStoreTemplate const agreementConditionIds = await templates.escrowAccessSecretStoreTemplate
.getAgreementIdsFromDDO(agreementId, ddo, consumer.getId(), consumer.getId()) .getAgreementIdsFromDDO(agreementId, ddo, consumer.getId(), consumer.getId())
const signature = await ServiceAgreement.signServiceAgreement( const signature = await ocean.utils.agreements.signServiceAgreement(
web3,
ddo, ddo,
serviceDefinitionId, serviceDefinitionId,
agreementId, agreementId,

211
package-lock.json generated
View File

@ -129,9 +129,9 @@
} }
}, },
"@oceanprotocol/keeper-contracts": { "@oceanprotocol/keeper-contracts": {
"version": "0.8.5", "version": "0.8.6",
"resolved": "https://registry.npmjs.org/@oceanprotocol/keeper-contracts/-/keeper-contracts-0.8.5.tgz", "resolved": "https://registry.npmjs.org/@oceanprotocol/keeper-contracts/-/keeper-contracts-0.8.6.tgz",
"integrity": "sha512-GRVsKAAX60PikLyeA6SEPm1NKOPCHW5C225H4Cpe+hww+qEbGu7Y2/Y+svWSXzfxElUanRZBdZfiEx4tdudIoQ==" "integrity": "sha512-WdIDedXZSS+AG3/K+issOJQ4Jmg0UtdNPpi1Ogo+sFogmYIa21m06pqvuAKK8tGG2o+KBW8nBUMyyA3mR2j+vg=="
}, },
"@oceanprotocol/secret-store-client": { "@oceanprotocol/secret-store-client": {
"version": "0.0.14", "version": "0.0.14",
@ -1158,12 +1158,6 @@
"unset-value": "^1.0.0" "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": { "caseless": {
"version": "0.12.0", "version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@ -1250,12 +1244,6 @@
"safe-buffer": "^5.0.1" "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": { "class-utils": {
"version": "0.3.6", "version": "0.3.6",
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
@ -1581,15 +1569,6 @@
"ms": "2.0.0" "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": { "decode-uri-component": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@ -2122,34 +2101,6 @@
"safe-buffer": "^5.1.1" "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": { "expand-brackets": {
"version": "2.1.4", "version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@ -2626,7 +2577,8 @@
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"aproba": { "aproba": {
"version": "1.2.0", "version": "1.2.0",
@ -2647,12 +2599,14 @@
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -2673,12 +2627,14 @@
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@ -2795,7 +2751,8 @@
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -2822,6 +2779,7 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@ -2829,12 +2787,14 @@
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.3.5", "version": "2.3.5",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.2", "safe-buffer": "^5.1.2",
"yallist": "^3.0.0" "yallist": "^3.0.0"
@ -2853,6 +2813,7 @@
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@ -2946,6 +2907,7 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -3031,7 +2993,8 @@
"safe-buffer": { "safe-buffer": {
"version": "5.1.2", "version": "5.1.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"safer-buffer": { "safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
@ -3067,6 +3030,7 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
@ -3086,6 +3050,7 @@
"version": "3.0.1", "version": "3.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"ansi-regex": "^2.0.0" "ansi-regex": "^2.0.0"
} }
@ -3129,12 +3094,14 @@
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
}, },
"yallist": { "yallist": {
"version": "3.0.3", "version": "3.0.3",
"bundled": true, "bundled": true,
"dev": true "dev": true,
"optional": true
} }
} }
}, },
@ -3597,12 +3564,6 @@
"integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
"dev": true "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": { "ipaddr.js": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
@ -4065,15 +4026,6 @@
"readable-stream": "^2.0.5" "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": { "lcov-result-merger": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/lcov-result-merger/-/lcov-result-merger-3.1.0.tgz", "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", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" "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": { "make-dir": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "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", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" "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": { "memory-fs": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
@ -4296,12 +4229,6 @@
"mime-db": "~1.38.0" "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": { "mimic-response": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "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": { "mock-fs": {
"version": "4.8.0", "version": "4.8.0",
"resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.8.0.tgz",
@ -5822,17 +5727,6 @@
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true "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": { "p-cancelable": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz",
@ -6086,12 +5980,6 @@
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
"dev": true "dev": true
}, },
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
"psl": { "psl": {
"version": "1.1.31", "version": "1.1.31",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
@ -8207,7 +8095,7 @@
"requires": { "requires": {
"underscore": "1.8.3", "underscore": "1.8.3",
"web3-core-helpers": "1.0.0-beta.37", "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": { "web3-shh": {
@ -8611,12 +8499,6 @@
"resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
"integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" "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": { "xtend": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "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", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" "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": { "yauzl": {
"version": "2.10.0", "version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "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", "homepage": "https://github.com/oceanprotocol/squid-js#readme",
"dependencies": { "dependencies": {
"@oceanprotocol/keeper-contracts": "^0.8.5", "@oceanprotocol/keeper-contracts": "^0.8.6",
"@oceanprotocol/secret-store-client": "~0.0.14", "@oceanprotocol/secret-store-client": "~0.0.14",
"bignumber.js": "^8.0.1", "bignumber.js": "^8.0.1",
"deprecated-decorator": "^0.1.6", "deprecated-decorator": "^0.1.6",

View File

@ -1,7 +1,7 @@
import * as Web3 from "web3" import * as Web3 from "web3"
import Web3Provider from "../keeper/Web3Provider" import Web3Provider from "../keeper/Web3Provider"
import LoggerInstance from "../utils/Logger" import LoggerInstance from "../utils/Logger"
import * as signatureHelpers from "../utils/SignatureHelpers" import { Ocean } from "../ocean/Ocean"
import { Authentication } from "./Authentication" import { Authentication } from "./Authentication"
import { Proof } from "./Proof" import { Proof } from "./Proof"
import { PublicKey } from "./PublicKey" import { PublicKey } from "./PublicKey"
@ -112,10 +112,10 @@ export class DDO {
* @param {string} password Password if it's requirted. * @param {string} password Password if it's requirted.
* @return {Promise<Proof>} Proof object. * @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 checksum = this.getChecksum()
const signature = await signatureHelpers.signText(web3, checksum, publicKey, password) const signature = await ocean.utils.signature.signText(checksum, publicKey, password)
return { return {
created: (new Date()).toISOString(), created: (new Date()).toISOString(),

View File

@ -3,6 +3,7 @@ import { OceanAgreements } from "./OceanAgreements"
import { OceanAssets } from "./OceanAssets" import { OceanAssets } from "./OceanAssets"
import { OceanSecretStore } from "./OceanSecretStore" import { OceanSecretStore } from "./OceanSecretStore"
import { OceanTokens } from "./OceanTokens" import { OceanTokens } from "./OceanTokens"
import { OceanUtils } from "./utils/OceanUtils"
import { Aquarius } from "../aquarius/Aquarius" import { Aquarius } from "../aquarius/Aquarius"
import { Brizo } from "../brizo/Brizo" import { Brizo } from "../brizo/Brizo"
@ -43,6 +44,8 @@ export class Ocean extends Instantiable {
instance.secretStore = await OceanSecretStore.getInstance(instanceConfig) instance.secretStore = await OceanSecretStore.getInstance(instanceConfig)
instance.tokens = await OceanTokens.getInstance(instanceConfig) instance.tokens = await OceanTokens.getInstance(instanceConfig)
instance.utils = await OceanUtils.getInstance(instanceConfig)
return instance return instance
} }
@ -94,6 +97,12 @@ export class Ocean extends Instantiable {
*/ */
public tokens: OceanTokens public tokens: OceanTokens
/**
* Ocean utils submodule
* @type {OceanUtils}
*/
public utils: OceanUtils
private constructor() { private constructor() {
super() super()
} }

View File

@ -1,7 +1,6 @@
import { generateId } from "../utils/GeneratorHelpers" import { generateId } from "../utils/GeneratorHelpers"
import Account from "./Account" import Account from "./Account"
import DID from "./DID" import DID from "./DID"
import ServiceAgreement from "./ServiceAgreements/ServiceAgreement"
import { zeroX, didPrefixed } from "../utils" import { zeroX, didPrefixed } from "../utils"
import { Instantiable, InstantiableConfig } from "../Instantiable.abstract" import { Instantiable, InstantiableConfig } from "../Instantiable.abstract"
@ -57,8 +56,7 @@ export class OceanAgreements extends Instantiable {
.getTemplateByName(templateName) .getTemplateByName(templateName)
.getAgreementIdsFromDDO(agreementId, ddo, consumer.getId(), consumer.getId()) .getAgreementIdsFromDDO(agreementId, ddo, consumer.getId(), consumer.getId())
const signature = await ServiceAgreement.signServiceAgreement( const signature = await this.ocean.utils.agreements.signServiceAgreement(
this.web3,
ddo, ddo,
serviceDefinitionId, serviceDefinitionId,
agreementId, agreementId,

View File

@ -135,7 +135,7 @@ export class OceanAssets extends Instantiable {
serviceAgreementTemplate.conditions = conditions serviceAgreementTemplate.conditions = conditions
ddo.addChecksum() 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) const storedDdo = await this.ocean.aquarius.storeDDO(ddo)
await didRegistry.registerAttribute( 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 { ServiceAgreementTemplateCondition } from "../../ddo/ServiceAgreementTemplate"
import { DDO } from "../../ddo/DDO" import { DDO } from "../../ddo/DDO"
import { ServiceAccess } from "../../ddo/Service" import { ServiceAccess } from "../../ddo/Service"
import LoggerInstance from "../../utils/Logger"
import Web3Provider from "../../keeper/Web3Provider"
import Account from "../Account" 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 class ServiceAgreement extends Instantiable {
export default class ServiceAgreement {
public static async signServiceAgreement( constructor(config: InstantiableConfig) {
web3: Web3, super()
this.setInstanceConfig(config)
}
public async signServiceAgreement(
ddo: DDO, ddo: DDO,
serviceDefinitionId: string, serviceDefinitionId: string,
serviceAgreementId: string, serviceAgreementId: string,
@ -20,15 +22,14 @@ export default class ServiceAgreement {
): Promise<string> { ): Promise<string> {
const service = ddo.findServiceById<"Access">(serviceDefinitionId) const service = ddo.findServiceById<"Access">(serviceDefinitionId)
const timelockValues: number[] = ServiceAgreement.getTimeValuesFromService(service, "timelock") const timelockValues: number[] = this.getTimeValuesFromService(service, "timelock")
const timeoutValues: number[] = ServiceAgreement.getTimeValuesFromService(service, "timeout") const timeoutValues: number[] = this.getTimeValuesFromService(service, "timeout")
if (!service.templateId) { if (!service.templateId) {
throw new Error("TemplateId not found in DDO.") throw new Error("TemplateId not found in DDO.")
} }
const serviceAgreementHashSignature = await ServiceAgreement.createHashSignature( const serviceAgreementHashSignature = await this.createHashSignature(
web3,
service.templateId, service.templateId,
serviceAgreementId, serviceAgreementId,
agreementConditionsIds, agreementConditionsIds,
@ -37,13 +38,12 @@ export default class ServiceAgreement {
consumer, consumer,
) )
LoggerInstance.log("SA hash signature:", serviceAgreementHashSignature) this.logger.debug("SA hash signature:", serviceAgreementHashSignature)
return serviceAgreementHashSignature return serviceAgreementHashSignature
} }
public static async createHashSignature( public async createHashSignature(
web3: Web3,
templateId: string, templateId: string,
serviceAgreementId: string, serviceAgreementId: string,
valueHashes: string[], valueHashes: string[],
@ -52,7 +52,7 @@ export default class ServiceAgreement {
consumer: Account, consumer: Account,
): Promise<string> { ): Promise<string> {
const serviceAgreementHash = ServiceAgreement.hashServiceAgreement( const serviceAgreementHash = this.hashServiceAgreement(
templateId, templateId,
serviceAgreementId, serviceAgreementId,
valueHashes, valueHashes,
@ -60,12 +60,13 @@ export default class ServiceAgreement {
timeoutValues, 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 return serviceAgreementHashSignature
} }
public static hashServiceAgreement( public hashServiceAgreement(
serviceAgreementTemplateId: string, serviceAgreementTemplateId: string,
serviceAgreementId: string, serviceAgreementId: string,
valueHashes: string[], valueHashes: string[],
@ -81,10 +82,10 @@ export default class ServiceAgreement {
{type: "bytes32", value: zeroX(serviceAgreementId)}, {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 const timeoutValues: number[] = service.serviceAgreementTemplate.conditions
.map((condition: ServiceAgreementTemplateCondition) => condition[type]) .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 "./Logger"
export * from "./SignatureHelpers"
export * from "./ConversionTypeHelpers" export * from "./ConversionTypeHelpers"
export * from "./GeneratorHelpers" export * from "./GeneratorHelpers"
export * from "./DDOHelpers" export * from "./DDOHelpers"

View File

@ -4,7 +4,6 @@ import * as Web3 from "web3"
import { DDO } from "../../src/ddo/DDO" import { DDO } from "../../src/ddo/DDO"
import { Service } from "../../src/ddo/Service" import { Service } from "../../src/ddo/Service"
import * as signatureHelpers from "../../src/utils/SignatureHelpers"
import { Ocean } from "../../src/ocean/Ocean" import { Ocean } from "../../src/ocean/Ocean"
import config from "../config" import config from "../config"
import TestContractHandler from "../keeper/TestContractHandler" import TestContractHandler from "../keeper/TestContractHandler"
@ -165,10 +164,12 @@ describe("DDO", () => {
}) })
let web3: Web3 let web3: Web3
let ocean: Ocean
beforeEach(async () => { beforeEach(async () => {
await TestContractHandler.prepareContracts() await TestContractHandler.prepareContracts()
web3 = (await Ocean.getInstance(config) as any).web3 ocean = await Ocean.getInstance(config)
web3 = (ocean as any).web3
}) })
afterEach(() => { afterEach(() => {
@ -256,10 +257,10 @@ describe("DDO", () => {
const signature = `0x${"a".repeat(130)}` const signature = `0x${"a".repeat(130)}`
it("should properly generate the proof", async () => { 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 ddo = new DDO(testDDO)
const checksum = ddo.getChecksum() const checksum = ddo.getChecksum()
const proof = await ddo.generateProof(web3, publicKey) const proof = await ddo.generateProof(ocean, publicKey)
assert.include(proof as any, { assert.include(proof as any, {
creator: publicKey, creator: publicKey,

View File

@ -2,37 +2,27 @@ import { assert, spy, use } from "chai"
import * as spies from "chai-spies" import * as spies from "chai-spies"
import { SearchQuery } from "../../src/aquarius/query/SearchQuery" import { SearchQuery } from "../../src/aquarius/query/SearchQuery"
import { DDO } from "../../src/ddo/DDO"
import Account from "../../src/ocean/Account" import Account from "../../src/ocean/Account"
import { Ocean } from "../../src/ocean/Ocean" import { Ocean } from "../../src/ocean/Ocean"
import * as signatureHelpers from "../../src/utils/SignatureHelpers"
import config from "../config" import config from "../config"
import TestContractHandler from "../keeper/TestContractHandler" import TestContractHandler from "../keeper/TestContractHandler"
import { metadataMock } from "../testdata/MetaData"
use(spies) use(spies)
let ocean: Ocean let ocean: Ocean
let accounts: Account[]
let testPublisher: Account
describe("Ocean", () => { describe("Ocean", () => {
const metadata = metadataMock
beforeEach(async () => {
spy.on(signatureHelpers, "signText", () => `0x${"a".repeat(130)}`)
})
afterEach(() => {
spy.restore()
})
before(async () => { before(async () => {
await TestContractHandler.prepareContracts() await TestContractHandler.prepareContracts()
ocean = await Ocean.getInstance(config) 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()", () => { 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 { assert, expect, spy, use } from "chai"
import * as spies from "chai-spies" import * as spies from "chai-spies"
import Web3Provider from "../../src/keeper/Web3Provider" import config from "../../config"
import { signText, verifyText } from "../../src/utils/SignatureHelpers"
import { Ocean } from "../../../src/ocean/Ocean"
use(spies) use(spies)
describe("SignatureHelpers", () => { describe("SignatureUtils", () => {
const publicKey = `0x${"a".repeat(40)}` const publicKey = `0x${"a".repeat(40)}`
const text = "0123456789abcde" const text = "0123456789abcde"
const signature = `0x${"a".repeat(130)}` const signature = `0x${"a".repeat(130)}`
let web3 let web3
let ocean: Ocean
before(async () => {
ocean = await Ocean.getInstance(config)
web3 = (ocean as any).web3
})
afterEach(() => { afterEach(() => {
spy.restore() spy.restore()
@ -21,19 +28,18 @@ describe("SignatureHelpers", () => {
let personalSignSpy let personalSignSpy
beforeEach(() => { beforeEach(() => {
web3 = Web3Provider.getWeb3()
personalSignSpy = spy.on(web3.eth.personal, "sign", () => signature) personalSignSpy = spy.on(web3.eth.personal, "sign", () => signature)
}) })
it("should sign a text as expected", async () => { 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) assert.equal(signed, signature)
expect(personalSignSpy).to.have.been.called.with(text, publicKey) expect(personalSignSpy).to.have.been.called.with(text, publicKey)
}) })
it("should sign a text as expected using password", async () => { 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) assert.equal(signed, signature)
expect(personalSignSpy).to.have.been.called.with(text, publicKey, "test") 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 () => { it("should recover the privateKey of a signed message", async () => {
const personalRecoverSpy = spy.on(web3.eth.personal, "ecRecover", () => publicKey) 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) assert.equal(publicKey, verifiedPublicKey)
expect(personalRecoverSpy).to.have.been.called.with(text, signature) expect(personalRecoverSpy).to.have.been.called.with(text, signature)