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

184 lines
6.0 KiB
TypeScript
Raw Normal View History

2019-06-20 00:20:09 +02:00
import { generateId } from '../utils/GeneratorHelpers'
import Account from './Account'
import DID from './DID'
import { zeroX, didPrefixed } from '../utils'
import { Instantiable, InstantiableConfig } from '../Instantiable.abstract'
import { AgreementConditionsStatus } from '../keeper/contracts/templates/AgreementTemplateBase'
2019-06-20 00:20:09 +02:00
import { ConditionState } from '../keeper/contracts/conditions/Condition.abstract'
2019-06-20 00:20:09 +02:00
import { OceanAgreementsConditions } from './OceanAgreementsConditions'
2020-01-29 14:38:44 +01:00
import { Service } from '../ddo/Service'
export interface AgreementPrepareResult {
2019-02-14 11:30:03 +01:00
agreementId: string
signature: string
}
2019-01-21 17:48:40 +01:00
/**
* Agreements submodule of Ocean Protocol.
*/
export class OceanAgreements extends Instantiable {
2019-01-21 17:48:40 +01:00
/**
* Returns the instance of OceanAgreements.
* @return {Promise<OceanAgreements>}
*/
2019-11-15 00:00:10 +01:00
public static async getInstance(
config: InstantiableConfig
): Promise<OceanAgreements> {
const instance = new OceanAgreements()
instance.setInstanceConfig(config)
2019-09-09 12:18:54 +02:00
instance.conditions = await OceanAgreementsConditions.getInstance(config)
2019-01-21 17:48:40 +01:00
return instance
2019-01-21 17:48:40 +01:00
}
/**
* Agreements Conditions submodule.
* @type {OceanAgreementsConditions}
*/
public conditions: OceanAgreementsConditions
2019-01-21 17:48:40 +01:00
/**
* Creates a consumer signature for the specified asset service.
* @param {string} did Decentralized ID.
2019-08-16 16:12:42 +02:00
* @param {number} index Service index.
* @param {Account} consumer Consumer account.
* @return {Promise<AgreementPrepareResult>} Agreement ID and signaturee.
*/
2019-11-15 00:00:10 +01:00
public async prepare(
did: string,
index: number,
consumer: Account
): Promise<AgreementPrepareResult> {
const d: DID = DID.parse(did as string)
const ddo = await this.ocean.aquarius.retrieveDDO(d)
2019-04-15 17:45:06 +02:00
const agreementId: string = zeroX(generateId())
2019-11-15 00:00:10 +01:00
const templateName = ddo.findServiceByType('access').attributes
.serviceAgreementTemplate.contractName
const agreementConditionsIds = await this.ocean.keeper
.getTemplateByName(templateName)
2020-01-15 19:28:04 +01:00
.getConditionIdsFromDDO(agreementId, ddo, consumer.getId(), consumer.getId())
const signature = await this.ocean.utils.agreements.signServiceAgreement(
ddo,
2019-08-16 16:12:42 +02:00
index,
agreementId,
agreementConditionsIds,
2019-06-20 00:20:09 +02:00
consumer
)
2019-06-20 00:20:09 +02:00
return { agreementId, signature }
}
/**
* Submit a service agreement to the publisher to create the agreement on-chain.
* @param {string} did Decentralized ID.
2019-08-16 16:12:42 +02:00
* @param {number} index Service index.
* @param {Account} consumer Consumer account.
* @return {Promise<void>}
*/
public async send(
did: string,
agreementId: string,
2019-08-16 16:12:42 +02:00
index: number,
signature: string,
2019-06-20 00:20:09 +02:00
consumer: Account
): Promise<void> {
2019-06-20 00:20:09 +02:00
const result = await this.ocean.brizo.initializeServiceAgreement(
didPrefixed(did),
zeroX(agreementId),
2019-08-16 16:12:42 +02:00
index,
2019-06-20 00:20:09 +02:00
zeroX(signature),
consumer.getId()
)
2019-02-21 17:58:54 +01:00
if (!result.ok) {
2019-09-09 12:18:54 +02:00
throw new Error('Error on initialize agreement: ' + (await result.text()))
2019-02-21 17:58:54 +01:00
}
}
/**
* Create a service agreement on-chain. This should be called by the publisher of the asset.
* Consumer signature will be verified on-chain, but it is recommended to verify the signature
* in this method before submitting on-chain.
2019-01-21 17:48:40 +01:00
* @param {string} did Decentralized ID.
* @param {string} agreementId Service agreement ID.
2019-08-16 16:12:42 +02:00
* @param {number} index Service index.
* @param {string} signature Service agreement signature.
2019-01-21 17:48:40 +01:00
* @param {Account} consumer Consumer account.
* @param {string} provider ethereum address of service provider
* @param {Account} from account of party creating the agreement (usually the consumer).
* @return {Promise<boolean>}
2019-01-21 17:48:40 +01:00
*/
public async create(
did: string,
agreementId: string,
2019-08-16 16:12:42 +02:00
index: number,
signature: string,
2019-01-21 17:48:40 +01:00
consumer: Account,
provider: string,
from: Account
) {
2019-01-21 17:48:40 +01:00
const d: DID = DID.parse(did)
const ddo = await this.ocean.aquarius.retrieveDDO(d)
2020-01-29 14:38:44 +01:00
const service: Service = ddo.findServiceById(index)
const templateName = service.attributes.serviceAgreementTemplate.contractName
2020-01-22 15:31:27 +01:00
return this.ocean.keeper
.getTemplateByName(templateName)
.createAgreementFromDDO(
agreementId,
ddo,
service.type,
consumer.getId(),
provider,
from.getId()
)
2019-01-21 17:48:40 +01:00
}
/**
* Get the status of a service agreement.
* @param {string} agreementId Service agreement ID.
* @param {boolean} extended Returns a complete status with dependencies.
* @return {Promise<any>}
*/
2019-11-15 00:00:10 +01:00
public async status(
agreementId: string,
extended?: false
): Promise<{ [condition: string]: ConditionState }>
2019-08-19 13:21:19 +02:00
2019-11-15 00:00:10 +01:00
public async status(
agreementId: string,
extended: true
): Promise<AgreementConditionsStatus>
2019-08-19 13:21:19 +02:00
2019-06-20 00:20:09 +02:00
public async status(agreementId: string, extended: boolean = false) {
2019-11-15 00:00:10 +01:00
const { templateId } = await this.ocean.keeper.agreementStoreManager.getAgreement(
agreementId
)
if (templateId === `0x${'0'.repeat(64)}`) {
2020-01-22 15:31:27 +01:00
this.logger.error(
`agreement ${agreementId} is not found, templateId is ${templateId}`
)
return
}
2019-11-15 00:00:10 +01:00
const fullStatus = await this.ocean.keeper
.getTemplateById(templateId)
.getAgreementStatus(agreementId, this.ocean.keeper.conditionStoreManager)
if (!fullStatus) {
return
}
if (extended) {
return fullStatus
}
const simpleStatus = {}
2019-06-20 00:20:09 +02:00
Object.entries(fullStatus).forEach(([condition, { state }]) => {
simpleStatus[condition] = state
})
return simpleStatus as any
}
2019-01-21 17:48:40 +01:00
}