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

fix lock Payment

This commit is contained in:
Sebastian Gerske 2018-11-22 13:14:38 +01:00
parent 2d41535bab
commit a6c09d0f88
7 changed files with 55 additions and 1810 deletions

1794
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -48,7 +48,7 @@
}, },
"homepage": "https://github.com/oceanprotocol/squid-js#readme", "homepage": "https://github.com/oceanprotocol/squid-js#readme",
"dependencies": { "dependencies": {
"@oceanprotocol/keeper-contracts": "0.3.23", "@oceanprotocol/keeper-contracts": "0.3.25",
"@oceanprotocol/secret-store-client": "0.0.12", "@oceanprotocol/secret-store-client": "0.0.12",
"bignumber.js": "^8.0.1", "bignumber.js": "^8.0.1",
"eth-crypto": "^1.2.7", "eth-crypto": "^1.2.7",
@ -64,7 +64,7 @@
"devDependencies": { "devDependencies": {
"@types/chai": "^4.1.7", "@types/chai": "^4.1.7",
"@types/mocha": "^5.2.5", "@types/mocha": "^5.2.5",
"@types/node": "^10.12.7", "@types/node": "^10.12.10",
"chai": "^4.2.0", "chai": "^4.2.0",
"mocha": "^5.2.0", "mocha": "^5.2.0",
"nyc": "^13.1.0", "nyc": "^13.1.0",

View File

@ -60,7 +60,7 @@ export default abstract class ContractBase {
if (!this.contract.methods[name]) { if (!this.contract.methods[name]) {
throw new Error(`Method "${name}" is not part of contract "${this.contractName}"`) throw new Error(`Method "${name}" is not part of contract "${this.contractName}"`)
} }
// Logger.log(name) // Logger.log(name, args)
const method = this.contract.methods[name] const method = this.contract.methods[name]
try { try {
const methodInstance = method(...args) const methodInstance = method(...args)

View File

@ -16,12 +16,12 @@ export default class ServiceAgreement extends ContractBase {
name: any, name: any,
fulfillmentIndices: number[], fulfillmentIndices: number[],
fulfillmentOperator: number, fulfillmentOperator: number,
ownerAddress: string) ownerAddress: string): Promise<Receipt> {
: Promise<Receipt> {
return this.send("setupAgreementTemplate", ownerAddress, [ return this.send("setupAgreementTemplate", ownerAddress, [
templateId, methodReflections.map((r) => r.address), templateId, methodReflections.map((r) => r.address),
methodReflections.map((r) => r.signature), dependencyMatrix, name, fulfillmentIndices, fulfillmentOperator, methodReflections.map((r) => r.signature), dependencyMatrix, name, fulfillmentIndices,
fulfillmentOperator,
]) ])
} }

View File

@ -205,8 +205,10 @@ export default class ServiceAgreement extends OceanBase {
super(serviceAgreementId) super(serviceAgreementId)
} }
public async lockPayment(assetId: string, price: number, consumer: Account): Promise<boolean> { public async buyAsset(assetId: string, price: number, consumer: Account): Promise<boolean> {
const {paymentConditions} = await Keeper.getInstance() const {paymentConditions, token} = await Keeper.getInstance()
await token.approve(paymentConditions.getAddress(), price, consumer.getId())
const lockPaymentReceipt = const lockPaymentReceipt =
await paymentConditions.lockPayment(this.getId(), assetId, price, await paymentConditions.lockPayment(this.getId(), assetId, price,
@ -222,7 +224,7 @@ export default class ServiceAgreement extends OceanBase {
await accessConditions.grantAccess(this.getId(), assetId, documentId, await accessConditions.grantAccess(this.getId(), assetId, documentId,
this.publisher.getId()) this.publisher.getId())
return grantAccessReceipt.status return !!grantAccessReceipt.events.AccessGranted
} }
public async getStatus() { public async getStatus() {

View File

@ -35,15 +35,11 @@ export default class ServiceAgreementTemplate extends OceanBase {
})) }))
const fulfillmentIndices: number[] = this.template.Methods const fulfillmentIndices: number[] = this.template.Methods
.map((method: Method, i: number) => method.isTerminalCondition ? i : undefined) .map((method: Method, i: number) => method.isTerminalCondition ? i : null)
.filter((index: number) => index !== undefined) .filter((index: number) => index !== null)
Logger.log(dependencyMatrix, fulfillmentIndices, this.template.fulfillmentOperator)
const {serviceAgreement} = await Keeper.getInstance() const {serviceAgreement} = await Keeper.getInstance()
const methodReflections = await this.getMethodReflections()
const owner = await this.getOwner() const owner = await this.getOwner()
if (owner.getId() === templateOwnerAddress) { if (owner.getId() === templateOwnerAddress) {
@ -60,7 +56,7 @@ export default class ServiceAgreementTemplate extends OceanBase {
const receipt = await serviceAgreement const receipt = await serviceAgreement
.setupAgreementTemplate( .setupAgreementTemplate(
this.template.id, this.template.id,
methodReflections, await this.getMethodReflections(),
dependencyMatrix, dependencyMatrix,
Web3Provider.getWeb3().utils.fromAscii(this.template.templateName), Web3Provider.getWeb3().utils.fromAscii(this.template.templateName),
fulfillmentIndices, fulfillmentIndices,
@ -126,21 +122,20 @@ export default class ServiceAgreementTemplate extends OceanBase {
throw new Error("Deps and timeouts need the same length") throw new Error("Deps and timeouts need the same length")
} }
// map name to index
const mappedDependencies: number[] = [] const mappedDependencies: number[] = []
const mappedDependencyTimeoutFlags: number[] = [] const mappedDependencyTimeoutFlags: number[] = []
this.template.Methods.forEach((m, i) => { this.template.Methods.forEach((m, i) => {
const di = dependencies.findIndex((d) => d === m.name) const di = dependencies.findIndex((d) => d === m.name)
mappedDependencies.push(di > -1 ? 1 : 0) mappedDependencies.push(di > -1 ? 1 : 0)
mappedDependencyTimeoutFlags.push(dependencyTimeoutFlags[i] ? 1 : 0) mappedDependencyTimeoutFlags.push((di > -1 && dependencyTimeoutFlags[di]) ? 1 : 0)
}) })
if (mappedDependencies.length !== mappedDependencyTimeoutFlags.length) { if (mappedDependencies.length !== mappedDependencyTimeoutFlags.length) {
throw new Error("Deps and timeouts need the same length") throw new Error("Deps and timeouts need the same length")
} }
Logger.log(dependencies, mappedDependencies, dependencyTimeoutFlags, mappedDependencyTimeoutFlags) // Logger.log(dependencies, mappedDependencies, dependencyTimeoutFlags, mappedDependencyTimeoutFlags)
let compressedDependencyValue: number = 0 let compressedDependencyValue: number = 0
const numBits: number = 2 // 1st for dependency, 2nd for timeout flag const numBits: number = 2 // 1st for dependency, 2nd for timeout flag

View File

@ -73,7 +73,8 @@ describe("ServiceAgreement", () => {
case "assetId": case "assetId":
return "0x" + assetId return "0x" + assetId
case "documentKeyId": case "documentKeyId":
return "0x1234" return "0x" + assetId
} }
return null return null
@ -118,8 +119,7 @@ describe("ServiceAgreement", () => {
describe("#signServiceAgreement()", () => { describe("#signServiceAgreement()", () => {
it("should sign an service agreement", async () => { it("should sign an service agreement", async () => {
const id: string = IdGenerator.generateId() const did: string = `did:op:${assetId}`
const did: string = `did:op:${id}`
const ddo = new DDO({id: did, service: [accessService]}) const ddo = new DDO({id: did, service: [accessService]})
const serviceAgreementId: string = IdGenerator.generateId() const serviceAgreementId: string = IdGenerator.generateId()
@ -138,8 +138,7 @@ describe("ServiceAgreement", () => {
describe("#executeServiceAgreement()", () => { describe("#executeServiceAgreement()", () => {
it("should execute an service agreement", async () => { it("should execute an service agreement", async () => {
const id: string = IdGenerator.generateId() const did: string = `did:op:${assetId}`
const did: string = `did:op:${id}`
const ddo = new DDO({id: did, service: [accessService]}) const ddo = new DDO({id: did, service: [accessService]})
const serviceAgreementId: string = IdGenerator.generateId() const serviceAgreementId: string = IdGenerator.generateId()
@ -163,8 +162,7 @@ describe("ServiceAgreement", () => {
describe("#getStatus()", () => { describe("#getStatus()", () => {
it("should get the status of a newly created service agreement", async () => { it("should get the status of a newly created service agreement", async () => {
const id: string = IdGenerator.generateId() const did: string = `did:op:${assetId}`
const did: string = `did:op:${id}`
const ddo = new DDO({id: did, service: [accessService]}) const ddo = new DDO({id: did, service: [accessService]})
const serviceAgreementId: string = IdGenerator.generateId() const serviceAgreementId: string = IdGenerator.generateId()
@ -185,16 +183,16 @@ describe("ServiceAgreement", () => {
}) })
}) })
describe("#lockPayment()", () => { describe("#buyAsset()", () => {
it("should lock the payment in that service agreement", async () => { it("should lock the payment in that service agreement", async () => {
const id: string = IdGenerator.generateId() const did: string = `did:op:${assetId}`
const did: string = `did:op:${id}`
const ddo = new DDO({id: did, service: [accessService, metaDataService]}) const ddo = new DDO({id: did, service: [accessService, metaDataService]})
const serviceAgreementId: string = IdGenerator.generateId() const serviceAgreementId: string = IdGenerator.generateId()
// @ts-ignore // @ts-ignore
WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo)) WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo))
const serviceAgreementSignature: string = const serviceAgreementSignature: string =
await ServiceAgreement.signServiceAgreement(assetId, ddo, accessService.serviceDefinitionId, await ServiceAgreement.signServiceAgreement(assetId, ddo, accessService.serviceDefinitionId,
serviceAgreementId, consumerAccount) serviceAgreementId, consumerAccount)
@ -208,7 +206,7 @@ describe("ServiceAgreement", () => {
// get funds // get funds
await consumerAccount.requestTokens(metaDataService.metadata.base.price) await consumerAccount.requestTokens(metaDataService.metadata.base.price)
const paid: boolean = await serviceAgreement.lockPayment(assetId, metaDataService.metadata.base.price, const paid: boolean = await serviceAgreement.buyAsset(assetId, metaDataService.metadata.base.price,
consumerAccount) consumerAccount)
assert(paid) assert(paid)
}) })
@ -217,8 +215,7 @@ describe("ServiceAgreement", () => {
describe("#grantAccess()", () => { describe("#grantAccess()", () => {
it("should grant access in that service agreement", async () => { it("should grant access in that service agreement", async () => {
const id: string = IdGenerator.generateId() const did: string = `did:op:${assetId}`
const did: string = `did:op:${id}`
const ddo = new DDO({id: did, service: [accessService]}) const ddo = new DDO({id: did, service: [accessService]})
const serviceAgreementId: string = IdGenerator.generateId() const serviceAgreementId: string = IdGenerator.generateId()
@ -237,18 +234,18 @@ describe("ServiceAgreement", () => {
// get funds // get funds
await consumerAccount.requestTokens(metaDataService.metadata.base.price) await consumerAccount.requestTokens(metaDataService.metadata.base.price)
const paid: boolean = await serviceAgreement.lockPayment(assetId, metaDataService.metadata.base.price, const paid: boolean = await serviceAgreement.buyAsset(assetId, metaDataService.metadata.base.price,
consumerAccount) consumerAccount)
assert(paid) assert(paid)
const accessGranted: boolean = await serviceAgreement.grantAccess(assetId, IdGenerator.generateId()) // todo: use document id
const accessGranted: boolean = await serviceAgreement.grantAccess(assetId, assetId)
assert(accessGranted) assert(accessGranted)
}) })
xit("should fail to grant grant access if there is no payment", async () => { it("should fail to grant grant access if there is no payment", async () => {
const id: string = IdGenerator.generateId() const did: string = `did:op:${assetId}`
const did: string = `did:op:${id}`
const ddo = new DDO({id: did, service: [accessService]}) const ddo = new DDO({id: did, service: [accessService]})
const serviceAgreementId: string = IdGenerator.generateId() const serviceAgreementId: string = IdGenerator.generateId()
@ -264,7 +261,8 @@ describe("ServiceAgreement", () => {
serviceAgreementId, serviceAgreementSignature, consumerAccount, publisherAccount) serviceAgreementId, serviceAgreementSignature, consumerAccount, publisherAccount)
assert(serviceAgreement) assert(serviceAgreement)
const accessGranted: boolean = await serviceAgreement.grantAccess(assetId, IdGenerator.generateId()) // todo: use document id
const accessGranted: boolean = await serviceAgreement.grantAccess(assetId, assetId)
assert(!accessGranted) assert(!accessGranted)
}) })
}) })