diff --git a/src/contract/deploy/CreateContract.ts b/src/contract/deploy/CreateContract.ts index 67a5105..bd7f2a9 100644 --- a/src/contract/deploy/CreateContract.ts +++ b/src/contract/deploy/CreateContract.ts @@ -1,6 +1,8 @@ import { JWKInterface } from 'arweave/node/lib/wallet'; import { SignatureType } from '../../contract/Signature'; import { Source } from './Source'; +import {EvaluationOptions} from "../../core/modules/StateEvaluator"; +import {WarpPluginType} from "../../core/WarpPlugin"; export type Tags = { name: string; value: string }[]; @@ -18,6 +20,11 @@ export const emptyTransfer: ArTransfer = { winstonQty: '0' }; +export type EvaluationManifest = { + evaluationOptions: Partial; + plugins: WarpPluginType[] +} + export interface CommonContractData { wallet: ArWallet | SignatureType; initState: string; @@ -27,6 +34,7 @@ export interface CommonContractData { 'Content-Type': string; body: string | Uint8Array | ArrayBuffer; }; + evaluationManifest?: EvaluationManifest } export interface ContractData extends CommonContractData { diff --git a/src/contract/deploy/impl/DefaultCreateContract.ts b/src/contract/deploy/impl/DefaultCreateContract.ts index 3c404f3..0dedc08 100644 --- a/src/contract/deploy/impl/DefaultCreateContract.ts +++ b/src/contract/deploy/impl/DefaultCreateContract.ts @@ -22,7 +22,7 @@ export class DefaultCreateContract implements CreateContract { } async deploy(contractData: ContractData, disableBundling?: boolean): Promise { - const { wallet, initState, tags, transfer, data } = contractData; + const { wallet, initState, tags, transfer, data, evaluationManifest } = contractData; const effectiveUseBundler = disableBundling == undefined ? this.warp.definitionLoader.type() == 'warp' : !disableBundling; @@ -41,7 +41,8 @@ export class DefaultCreateContract implements CreateContract { initState, tags, transfer, - data + data, + evaluationManifest }, !effectiveUseBundler, srcTx @@ -54,7 +55,7 @@ export class DefaultCreateContract implements CreateContract { srcTx: Transaction = null ): Promise { this.logger.debug('Creating new contract from src tx'); - const { wallet, srcTxId, initState, tags, transfer, data } = contractData; + const { wallet, srcTxId, initState, tags, transfer, data, evaluationManifest } = contractData; this.signature = new Signature(this.warp, wallet); const signer = this.signature.signer; @@ -94,6 +95,10 @@ export class DefaultCreateContract implements CreateContract { contractTX.addTag(SmartWeaveTags.WARP_TESTNET, '1.0.0'); } + if (contractData.evaluationManifest) { + contractTX.addTag(SmartWeaveTags.MANIFEST, JSON.stringify(contractData.evaluationManifest)); + } + await signer(contractTX); let responseOk: boolean; diff --git a/src/core/ContractDefinition.ts b/src/core/ContractDefinition.ts index 82e73f7..4d012aa 100644 --- a/src/core/ContractDefinition.ts +++ b/src/core/ContractDefinition.ts @@ -2,7 +2,7 @@ * This type contains all data and meta-data of the given contact. */ -import { ContractType } from '../contract/deploy/CreateContract'; +import {ContractType, EvaluationManifest} from '../contract/deploy/CreateContract'; export class ContractMetadata { dtor: number; @@ -28,6 +28,7 @@ export type ContractDefinition = { owner: string; contractType: ContractType; metadata?: ContractMetadata; + manifest?: EvaluationManifest; contractTx: any; srcTx: any; testnet: string | null; diff --git a/src/core/SmartWeaveTags.ts b/src/core/SmartWeaveTags.ts index 044cd37..d0a5ed8 100644 --- a/src/core/SmartWeaveTags.ts +++ b/src/core/SmartWeaveTags.ts @@ -18,5 +18,6 @@ export enum SmartWeaveTags { WASM_META = 'Wasm-Meta', REQUEST_VRF = 'Request-Vrf', SIGNATURE_TYPE = 'Signature-Type', - WARP_TESTNET = 'Warp-Testnet' + WARP_TESTNET = 'Warp-Testnet', + MANIFEST = 'Contract-Manifest' } diff --git a/src/core/modules/impl/ContractDefinitionLoader.ts b/src/core/modules/impl/ContractDefinitionLoader.ts index c4558ef..9facd92 100644 --- a/src/core/modules/impl/ContractDefinitionLoader.ts +++ b/src/core/modules/impl/ContractDefinitionLoader.ts @@ -53,6 +53,12 @@ export class ContractDefinitionLoader implements DefinitionLoader { throw new Error('Trying to use non-testnet contract in a testnet env.'); } const minFee = this.tagsParser.getTag(contractTx, SmartWeaveTags.MIN_FEE); + let manifest = null; + const rawManifest = this.tagsParser.getTag(contractTx, SmartWeaveTags.MANIFEST); + if (rawManifest) { + manifest = JSON.parse(rawManifest); + } + this.logger.debug('Tags decoding', benchmark.elapsed()); benchmark.reset(); const s = await this.evalInitialState(contractTx); @@ -75,6 +81,7 @@ export class ContractDefinitionLoader implements DefinitionLoader { owner, contractType, metadata, + manifest, contractTx: contractTx.toJSON(), srcTx, testnet diff --git a/src/core/modules/impl/WarpGatewayContractDefinitionLoader.ts b/src/core/modules/impl/WarpGatewayContractDefinitionLoader.ts index 45091bc..b08c72a 100644 --- a/src/core/modules/impl/WarpGatewayContractDefinitionLoader.ts +++ b/src/core/modules/impl/WarpGatewayContractDefinitionLoader.ts @@ -11,9 +11,6 @@ import { ArweaveWrapper } from '../../../utils/ArweaveWrapper'; import { stripTrailingSlash } from '../../../utils/utils'; import { DefinitionLoader } from '../DefinitionLoader'; import { WasmSrc } from './wasm/WasmSrc'; -import { CacheOptions } from '../../WarpFactory'; -import { MemoryLevel } from 'memory-level'; -import { Level } from 'level'; import { WarpEnvironment } from '../../Warp'; import { TagsParser } from './TagsParser'; import { SortKeyCache } from '../../../cache/SortKeyCache';