diff --git a/.jest/__fixtures__/assetWithAccessDetails.ts b/.jest/__fixtures__/assetWithAccessDetails.ts index 9987ff9c0..4a1751ddb 100644 --- a/.jest/__fixtures__/assetWithAccessDetails.ts +++ b/.jest/__fixtures__/assetWithAccessDetails.ts @@ -3,6 +3,7 @@ import { assetAquarius } from './assetAquarius' export const asset: AssetExtended = { ...assetAquarius, accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: diff --git a/.jest/__fixtures__/assetsWithAccessDetails.ts b/.jest/__fixtures__/assetsWithAccessDetails.ts index cf15fb8af..8e212e942 100644 --- a/.jest/__fixtures__/assetsWithAccessDetails.ts +++ b/.jest/__fixtures__/assetsWithAccessDetails.ts @@ -73,6 +73,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, type: 'NOT_SUPPORTED' } as any }, @@ -159,6 +160,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -252,6 +254,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 2, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -345,6 +348,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -444,6 +448,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -468,6 +473,7 @@ export const assets: AssetExtended[] = [ { '@context': ['https://w3id.org/did/v1'], accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -660,6 +666,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -753,6 +760,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -843,6 +851,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'free', addressOrId: '0x0a81f1c69e5428067e6124817c7affe8bc0adf9f', @@ -927,6 +936,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -1015,6 +1025,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 2, publisherMarketOrderFee: '0', type: 'free', addressOrId: '0x772224c2c2bddb88a55b3905aaaf8c7188b02ce3', @@ -1099,6 +1110,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 2, publisherMarketOrderFee: '0', type: 'free', addressOrId: '0x89a0170556bb80438081d69f43d8c07a90e9aa24', @@ -1181,6 +1193,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 2, publisherMarketOrderFee: '0', type: 'free', addressOrId: '0xad42c7afee47140b5cd87f05d5846c418145f43a', @@ -1335,6 +1348,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 2, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: @@ -1423,6 +1437,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 2, publisherMarketOrderFee: '0', type: 'free', addressOrId: '0x23c1fd10dadcaf558fb7173b79cfd0d867568a3d', @@ -1514,6 +1529,7 @@ export const assets: AssetExtended[] = [ }, version: '4.1.0', accessDetails: { + templateId: 2, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: diff --git a/app.config.js b/app.config.js index becac0d03..2340747bf 100644 --- a/app.config.js +++ b/app.config.js @@ -18,6 +18,7 @@ module.exports = { infuraProjectId: process.env.NEXT_PUBLIC_INFURA_PROJECT_ID || 'xxx', + defaultDatatokenTemplateIndex: 2, // The ETH address the marketplace fee will be sent to. marketFeeAddress: process.env.NEXT_PUBLIC_MARKET_FEE_ADDRESS || diff --git a/src/@context/MarketMetadata/_types.ts b/src/@context/MarketMetadata/_types.ts index 4d7ebe01c..6bd9f746c 100644 --- a/src/@context/MarketMetadata/_types.ts +++ b/src/@context/MarketMetadata/_types.ts @@ -10,6 +10,7 @@ export interface AppConfig { infuraProjectId: string chainIds: number[] chainIdsSupported: number[] + defaultDatatokenTemplateIndex: number marketFeeAddress: string publisherMarketOrderFee: string publisherMarketFixedSwapFee: string diff --git a/src/@types/Price.d.ts b/src/@types/Price.d.ts index 4f47b8578..1698313d2 100644 --- a/src/@types/Price.d.ts +++ b/src/@types/Price.d.ts @@ -39,6 +39,7 @@ declare global { interface AccessDetails { type: 'fixed' | 'free' | 'NOT_SUPPORTED' price: string + templateId: number addressOrId: string baseToken: TokenInfo datatoken: TokenInfo diff --git a/src/@utils/accessDetailsAndPricing.ts b/src/@utils/accessDetailsAndPricing.ts index b23c219d3..2d053684c 100644 --- a/src/@utils/accessDetailsAndPricing.ts +++ b/src/@utils/accessDetailsAndPricing.ts @@ -30,6 +30,7 @@ const tokensPriceQuery = gql` publishMarketFeeAddress publishMarketFeeToken publishMarketFeeAmount + templateId orders( where: { payer: $account } orderBy: createdTimestamp @@ -84,6 +85,7 @@ const tokenPriceQuery = gql` id symbol name + templateId publishMarketFeeAddress publishMarketFeeToken publishMarketFeeAmount @@ -160,7 +162,7 @@ function getAccessDetailsFromTokenPrice( // the last valid order should be the last reuse order tx id if there is one accessDetails.validOrderTx = reusedOrder?.tx || order?.tx } - + accessDetails.templateId = tokenPrice.templateId // TODO: fetch order fee from sub query accessDetails.publisherMarketOrderFee = tokenPrice?.publishMarketFeeAmount @@ -169,6 +171,7 @@ function getAccessDetailsFromTokenPrice( const dispenser = tokenPrice.dispensers[0] accessDetails.type = 'free' accessDetails.addressOrId = dispenser.token.id + accessDetails.price = '0' accessDetails.isPurchasable = dispenser.active accessDetails.datatoken = { diff --git a/src/@utils/order.ts b/src/@utils/order.ts index 3f9337d77..c97c770d4 100644 --- a/src/@utils/order.ts +++ b/src/@utils/order.ts @@ -3,6 +3,8 @@ import { approve, approveWei, Datatoken, + Dispenser, + FixedRateExchange, FreOrderParams, LoggerInstance, OrderParams, @@ -83,22 +85,6 @@ export async function order( switch (asset.accessDetails?.type) { case 'fixed': { // this assumes all fees are in ocean - const txApprove = await approve( - web3, - config, - accountId, - asset.accessDetails.baseToken.address, - asset.accessDetails.datatoken.address, - await amountToUnits( - web3, - asset?.accessDetails?.baseToken?.address, - orderPriceAndFees.price - ), - false - ) - if (!txApprove) { - return - } const freParams = { exchangeContract: config.fixedRateExchangeAddress, @@ -109,23 +95,96 @@ export async function order( swapMarketFee: consumeMarketFixedSwapFee, marketFeeAddress } as FreOrderParams - const tx = await datatoken.buyFromFreAndOrder( - asset.accessDetails.datatoken.address, - accountId, - orderParams, - freParams - ) - return tx + if (asset.accessDetails.templateId === 1) { + // buy datatoken + const txApprove = await approve( + web3, + config, + accountId, + asset.accessDetails.baseToken.address, + config.fixedRateExchangeAddress, + await amountToUnits( + web3, + asset?.accessDetails?.baseToken?.address, + orderPriceAndFees.price + ), + false + ) + if (!txApprove) { + return + } + const fre = new FixedRateExchange(config.fixedRateExchangeAddress, web3) + const freTx = await fre.buyDatatokens( + accountId, + asset.accessDetails?.addressOrId, + '1', + orderPriceAndFees.price, + marketFeeAddress, + consumeMarketFixedSwapFee + ) + + return await datatoken.startOrder( + asset.accessDetails.datatoken.address, + accountId, + orderParams.consumer, + orderParams.serviceIndex, + orderParams._providerFee, + orderParams._consumeMarketFee + ) + } + if (asset.accessDetails.templateId === 2) { + const txApprove = await approve( + web3, + config, + accountId, + asset.accessDetails.baseToken.address, + asset.accessDetails.datatoken.address, + await amountToUnits( + web3, + asset?.accessDetails?.baseToken?.address, + orderPriceAndFees.price + ), + false + ) + if (!txApprove) { + return + } + return await datatoken.buyFromFreAndOrder( + asset.accessDetails.datatoken.address, + accountId, + orderParams, + freParams + ) + } + break } case 'free': { - const tx = await datatoken.buyFromDispenserAndOrder( - asset.services[0].datatokenAddress, - accountId, - orderParams, - config.dispenserAddress - ) - return tx + if (asset.accessDetails.templateId === 1) { + const dispenser = new Dispenser(config.dispenserAddress, web3) + const dispenserTx = await dispenser.dispense( + asset.accessDetails?.datatoken.address, + accountId, + '1', + accountId + ) + return await datatoken.startOrder( + asset.accessDetails.datatoken.address, + accountId, + orderParams.consumer, + orderParams.serviceIndex, + orderParams._providerFee, + orderParams._consumeMarketFee + ) + } + if (asset.accessDetails.templateId === 2) { + return await datatoken.buyFromDispenserAndOrder( + asset.services[0].datatokenAddress, + accountId, + orderParams, + config.dispenserAddress + ) + } } } } diff --git a/src/components/Publish/Preview/index.tsx b/src/components/Publish/Preview/index.tsx index 03448d5db..857c9e559 100644 --- a/src/components/Publish/Preview/index.tsx +++ b/src/components/Publish/Preview/index.tsx @@ -17,6 +17,7 @@ export default function Preview(): ReactElement { asset.accessDetails = { type: values.pricing.type, addressOrId: ZERO_ADDRESS, + templateId: 1, price: `${values.pricing.price}`, baseToken: { address: ZERO_ADDRESS, diff --git a/src/components/Publish/_utils.ts b/src/components/Publish/_utils.ts index f211f4acf..f76f2a684 100644 --- a/src/components/Publish/_utils.ts +++ b/src/components/Publish/_utils.ts @@ -23,7 +23,8 @@ import { FormPublishData, MetadataAlgorithmContainer } from './_types' import { marketFeeAddress, publisherMarketOrderFee, - publisherMarketFixedSwapFee + publisherMarketFixedSwapFee, + defaultDatatokenTemplateIndex } from '../../../app.config' import { sanitizeUrl } from '@utils/url' import { getContainerChecksum } from '@utils/docker' @@ -211,7 +212,7 @@ export async function createTokensAndPricing( // TODO: cap is hardcoded for now to 1000, this needs to be discussed at some point const ercParams: DatatokenCreateParams = { - templateIndex: 2, + templateIndex: defaultDatatokenTemplateIndex, minter: accountId, paymentCollector: accountId, mpFeeAddress: marketFeeAddress,