1
0
mirror of https://github.com/oceanprotocol/ocean.js.git synced 2024-11-26 20:39:05 +01:00
2024-07-01 14:06:13 +01:00

207 lines
5.8 KiB
TypeScript

import { SHA256 } from 'crypto-js'
import { ethers, Signer } from 'ethers'
import {
Aquarius,
DatatokenCreateParams,
Nft,
NftCreateData,
NftFactory,
ProviderInstance,
ZERO_ADDRESS,
approveWei,
ProviderComputeInitialize,
ConsumeMarketFee,
Datatoken,
Config,
DDO,
ProviderFees,
getEventFromTx
} from '../../src'
export async function createAsset(
name: string,
symbol: string,
owner: Signer,
assetUrl: any,
ddo: any,
providerUrl: string,
nftContractAddress: string, // addresses.ERC721Factory,
aquariusInstance: Aquarius
) {
const nft = new Nft(owner, (await owner.provider.getNetwork()).chainId)
const nftFactory = new NftFactory(nftContractAddress, owner)
const chain = (await owner.provider.getNetwork()).chainId
ddo.chainId = parseInt(chain.toString(10))
const nftParamsAsset: NftCreateData = {
name,
symbol,
templateIndex: 1,
tokenURI: 'aaa',
transferable: true,
owner: await owner.getAddress()
}
const datatokenParams: DatatokenCreateParams = {
templateIndex: 1,
cap: '100000',
feeAmount: '0',
paymentCollector: ZERO_ADDRESS,
feeToken: ZERO_ADDRESS,
minter: await owner.getAddress(),
mpFeeAddress: ZERO_ADDRESS
}
const bundleNFT = await nftFactory.createNftWithDatatoken(
nftParamsAsset,
datatokenParams
)
const trxReceipt = await bundleNFT.wait()
// events have been emitted
const nftCreatedEvent = getEventFromTx(trxReceipt, 'NFTCreated')
const tokenCreatedEvent = getEventFromTx(trxReceipt, 'TokenCreated')
const nftAddress = nftCreatedEvent.args.newTokenAddress
const datatokenAddressAsset = tokenCreatedEvent.args.newTokenAddress
// create the files encrypted string
assetUrl.datatokenAddress = datatokenAddressAsset
assetUrl.nftAddress = nftAddress
ddo.services[0].files = await ProviderInstance.encrypt(assetUrl, chain, providerUrl)
ddo.services[0].datatokenAddress = datatokenAddressAsset
ddo.services[0].serviceEndpoint = 'http://172.15.0.4:8030' // put back proviederUrl
ddo.nftAddress = nftAddress
ddo.id = 'did:op:' + SHA256(ethers.utils.getAddress(nftAddress) + chain.toString(10))
const encryptedResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
const validateResult = await aquariusInstance.validate(ddo)
await nft.setMetadata(
nftAddress,
await owner.getAddress(),
0,
'http://172.15.0.4:8030', // put back proviederUrl
'',
ethers.utils.hexlify(2),
encryptedResponse,
validateResult.hash
)
return ddo.id
}
export async function updateAssetMetadata(
owner: Signer,
updatedDdo: DDO,
providerUrl: string,
aquariusInstance: Aquarius
) {
const nft = new Nft(owner, (await owner.provider.getNetwork()).chainId)
const providerResponse = await ProviderInstance.encrypt(
updatedDdo,
updatedDdo.chainId,
providerUrl
)
const encryptedResponse = await providerResponse
const validateResult = await aquariusInstance.validate(updatedDdo)
const updateDdoTX = await nft.setMetadata(
updatedDdo.nftAddress,
await owner.getAddress(),
0,
providerUrl,
'',
ethers.utils.hexlify(2),
encryptedResponse,
validateResult.hash
)
return updateDdoTX
}
export async function handleComputeOrder(
order: ProviderComputeInitialize,
datatokenAddress: string,
payerAccount: Signer,
consumerAccount: string,
serviceIndex: number,
datatoken: Datatoken,
config: Config,
consumeMarkerFee?: ConsumeMarketFee
) {
/* We do have 3 possible situations:
- have validOrder and no providerFees -> then order is valid, providerFees are valid, just use it in startCompute
- have validOrder and providerFees -> then order is valid but providerFees are not valid, we need to call reuseOrder and pay only providerFees
- no validOrder -> we need to call startOrder, to pay 1 DT & providerFees
*/
if (order.providerFee && order.providerFee.providerFeeAmount) {
await approveWei(
payerAccount,
config,
await payerAccount.getAddress(),
order.providerFee.providerFeeToken,
datatokenAddress,
order.providerFee.providerFeeAmount
)
}
if (order.validOrder) {
if (!order.providerFee) return order.validOrder
const tx = await datatoken.reuseOrder(
datatokenAddress,
order.validOrder,
order.providerFee
)
const reusedTx = await tx.wait()
const orderReusedTx = getEventFromTx(reusedTx, 'OrderReused')
return orderReusedTx.transactionHash
}
const tx = await datatoken.startOrder(
datatokenAddress,
consumerAccount,
serviceIndex,
order.providerFee,
consumeMarkerFee
)
const orderTx = await tx.wait()
const orderStartedTx = getEventFromTx(orderTx, 'OrderStarted')
return orderStartedTx.transactionHash
}
export async function orderAsset(
did: string,
datatokenAddress: string,
consumerAccount: string,
serviceId: string,
serviceIndex: number,
datatoken: Datatoken,
providerUrl: string
) {
const initializeData = await ProviderInstance.initialize(
did,
serviceId,
serviceIndex,
consumerAccount,
providerUrl
)
const providerFees: ProviderFees = {
providerFeeAddress: initializeData.providerFee.providerFeeAddress,
providerFeeToken: initializeData.providerFee.providerFeeToken,
providerFeeAmount: initializeData.providerFee.providerFeeAmount,
v: initializeData.providerFee.v,
r: initializeData.providerFee.r,
s: initializeData.providerFee.s,
providerData: initializeData.providerFee.providerData,
validUntil: initializeData.providerFee.validUntil
}
// make the payment
const tx = await datatoken.startOrder(
datatokenAddress,
consumerAccount,
0,
providerFees
)
const orderTx = await tx.wait()
const orderStartedTx = getEventFromTx(orderTx, 'OrderStarted')
return orderStartedTx
}