Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add widget meta-data - v0.11.0 #44

Merged
merged 4 commits into from
Nov 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions src/generatedTypes/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import * as v0_1_0 from './v0.1.0'
import * as v0_10_0 from './v0.10.0'
import * as v0_11_0 from './v0.11.0'
import * as v0_2_0 from './v0.2.0'
import * as v0_3_0 from './v0.3.0'
import * as v0_4_0 from './v0.4.0'
Expand All @@ -11,18 +12,20 @@ import * as v0_7_0 from './v0.7.0'
import * as v0_8_0 from './v0.8.0'
import * as v0_9_0 from './v0.9.0'

export * as latest from './v0.10.0'
export * as latest from './v0.11.0'

export const LATEST_APP_DATA_VERSION = '0.10.0'
export const LATEST_APP_DATA_VERSION = '0.11.0'
export const LATEST_QUOTE_METADATA_VERSION = '0.3.0'
export const LATEST_REFERRER_METADATA_VERSION = '0.2.0'
export const LATEST_ORDER_CLASS_METADATA_VERSION = '0.3.0'
export const LATEST_UTM_METADATA_VERSION = '0.2.0'
export const LATEST_HOOKS_METADATA_VERSION = '0.1.0'
export const LATEST_SIGNER_METADATA_VERSION = '0.1.0'
anxolin marked this conversation as resolved.
Show resolved Hide resolved
export const LATEST_WIDGET_METADATA_VERSION = '0.1.0'

export type LatestAppDataDocVersion = v0_10_0.AppDataRootSchema
export type LatestAppDataDocVersion = v0_11_0.AppDataRootSchema
export type AnyAppDataDocVersion =
| v0_11_0.AppDataRootSchema
| v0_10_0.AppDataRootSchema
| v0_9_0.AppDataRootSchema
| v0_8_0.AppDataRootSchema
Expand All @@ -35,6 +38,7 @@ export type AnyAppDataDocVersion =
| v0_1_0.AppDataRootSchema

export {
v0_11_0,
v0_10_0,
v0_9_0,
v0_8_0,
Expand Down
140 changes: 140 additions & 0 deletions src/generatedTypes/v0.11.0.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
/* tslint:disable */
/**
* This file was automatically generated by json-schema-to-typescript.
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
* and run json-schema-to-typescript to regenerate this file.
*/

/**
* Semantic versioning of document.
*/
export type Version = string;
/**
* The code identifying the CLI, UI, service generating the order.
*/
export type AppCode = string;
/**
* Environment from which the order came from.
*/
export type Environment = string;
/**
* The address of the trader who signs the CoW Swap order. This field should normally be omitted; it is recommended to use it if the signer is a smart-contract wallet using EIP-1271 signatures.
*/
export type Signer = string;
export type ReferrerAddress = string;
/**
* Tracks in which medium the traffic originated from (twitter, facebook, etc.)
*/
export type UTMSource = string;
/**
* Tracks in which medium the traffic originated from (mail, CPC, social, etc.)
*/
export type UTMMedium = string;
/**
* Track the performance of a specific campaign
*/
export type UTMCampaign = string;
/**
* Track which link was clicked
*/
export type UTMContent = string;
/**
* Track which keyword term a website visitor came from
*/
export type UTMKeywordTerm = string;
/**
* Slippage tolerance that was applied to the order to get the limit price. Expressed in Basis Points (BIPS)
*/
export type SlippageBips = string;
/**
* Indicator of the order class.
*/
export type OrderClass1 = "market" | "limit" | "liquidity" | "twap";
/**
* Semantic versioning of document.
*/
export type Version1 = string;
/**
* The contract to call for the hook
*/
export type HookTarget = string;
/**
* The calldata to use when calling the hook
*/
export type HookCallData = string;
/**
* The gas limit (in gas units) for the hook
*/
export type HookGasLimit = string;
/**
* CoW Hooks to call before an order executes
*/
export type PreHooks = CoWHook[];
/**
* CoW Hooks to call after an order executes
*/
export type PostHooks = CoWHook[];
/**
* The code identifying the UI powering the widget
*/
export type AppCode1 = string;
/**
* Environment from which the order came from.
*/
export type Environment1 = string;

/**
* Metadata JSON document for adding information to orders.
*/
export interface AppDataRootSchema {
version: Version;
appCode?: AppCode;
environment?: Environment;
metadata: Metadata;
}
/**
* Each metadata will specify one aspect of the order.
*/
export interface Metadata {
signer?: Signer;
referrer?: Referrer;
utm?: UTMCodes;
quote?: Quote;
orderClass?: OrderClass;
hooks?: OrderInteractionHooks;
widget?: Widget;
}
export interface Referrer {
address: ReferrerAddress;
}
export interface UTMCodes {
utmSource?: UTMSource;
utmMedium?: UTMMedium;
utmCampaign?: UTMCampaign;
utmContent?: UTMContent;
utmTerm?: UTMKeywordTerm;
}
export interface Quote {
slippageBips: SlippageBips;
}
export interface OrderClass {
orderClass: OrderClass1;
}
/**
* Optional Pre and Post order interaction hooks attached to a single order
*/
export interface OrderInteractionHooks {
version?: Version1;
pre?: PreHooks;
post?: PostHooks;
}
export interface CoWHook {
target: HookTarget;
callData: HookCallData;
gasLimit: HookGasLimit;
}
export interface Widget {
appCode: AppCode1;
environment?: Environment1;
[k: string]: unknown;
}
62 changes: 62 additions & 0 deletions src/schemas/v0.11.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
{
"$id": "https://cowswap.exchange/schemas/app-data/v0.11.0.json",
"$schema": "http://json-schema.org/draft-07/schema",
"description": "Metadata JSON document for adding information to orders.",
"required": ["version", "metadata"],
"title": "AppData Root Schema",
"type": "object",
"additionalProperties": false,
"properties": {
"version": {
"$ref": "definitions.json#/definitions/version",
"readOnly": true,
"default": "0.11.0"
},
"appCode": {
"$id": "#/properties/appCode",
"description": "The code identifying the CLI, UI, service generating the order.",
"examples": ["CoW Swap"],
"title": "App Code",
"type": "string"
},
"environment": {
"$id": "#/properties/environment",
"description": "Environment from which the order came from.",
"title": "Environment",
"type": "string",
"examples": ["production", "development", "staging", "ens"]
},
"metadata": {
"$id": "#/properties/metadata",
"default": {},
"description": "Each metadata will specify one aspect of the order.",
"required": [],
"title": "Metadata",
"type": "object",
"additionalProperties": false,
"properties": {
"signer": {
"$ref": "signer/v0.1.0.json#"
},
"referrer": {
"$ref": "referrer/v0.2.0.json#"
},
"utm": {
"$ref": "utm/v0.2.0.json#"
},
"quote": {
"$ref": "quote/v0.3.0.json#"
},
"orderClass": {
"$ref": "orderClass/v0.3.0.json#"
},
"hooks": {
"$ref": "hooks/v0.1.0.json#"
},
"widget": {
"$ref": "widget/v0.1.0.json#"
}
}
}
}
}
23 changes: 23 additions & 0 deletions src/schemas/widget/v0.1.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"$id": "#widget/v0.1.0.json",
"$schema": "http://json-schema.org/draft-07/schema",
"required": ["appCode"],
"title": "Widget",
"type": "object",
"properties": {
"appCode": {
"$id": "#/properties/appCodeWidget",
"description": "The code identifying the UI powering the widget",
"examples": ["CoW Swap"],
"title": "App Code",
"type": "string"
},
"environment": {
"$id": "#/properties/environmentWidget",
"description": "Environment from which the order came from.",
"title": "Environment",
"type": "string",
"examples": ["production", "development", "staging", "ens"]
}
}
}
4 changes: 3 additions & 1 deletion src/scripts/compile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ async function compile(): Promise<void> {
const latestUtmVersion = await getLatestMetadataDocVersion('utm')
const latestHooksVersion = await getLatestMetadataDocVersion('hooks')
const latestSignerVersion = await getLatestMetadataDocVersion('signer')
const latestWidgetVersion = await getLatestMetadataDocVersion('widget')

const additionalTypesExport = `
export * as latest from './${latest}'
Expand All @@ -74,6 +75,7 @@ export const LATEST_ORDER_CLASS_METADATA_VERSION = '${extractSemver(latestOrderC
export const LATEST_UTM_METADATA_VERSION = '${extractSemver(latestUtmVersion)}'
export const LATEST_HOOKS_METADATA_VERSION = '${extractSemver(latestHooksVersion)}'
export const LATEST_SIGNER_METADATA_VERSION = '${extractSemver(latestSignerVersion)}'
export const LATEST_WIDGET_METADATA_VERSION = '${extractSemver(latestWidgetVersion)}'

export type LatestAppDataDocVersion = ${latestExport}.AppDataRootSchema
export type AnyAppDataDocVersion = ${allVersions}
Expand All @@ -98,7 +100,7 @@ function extractSemver(name: string): string {
}

async function getLatestMetadataDocVersion(
metadataDocName: 'quote' | 'referrer' | 'orderClass' | 'utm' | 'hooks' | 'signer'
metadataDocName: 'quote' | 'referrer' | 'orderClass' | 'utm' | 'hooks' | 'signer' | 'widget'
): Promise<string> {
const metadataPath = path.join(SCHEMAS_SRC_PATH, metadataDocName)
const versions = await fs.promises.readdir(metadataPath)
Expand Down
75 changes: 75 additions & 0 deletions test/schema.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import schemaV0_5_0 from '../schemas/v0.5.0.json'
import schemaV0_6_0 from '../schemas/v0.6.0.json'
import schemaV0_9_0 from '../schemas/v0.9.0.json'
import schemaV0_10_0 from '../schemas/v0.10.0.json'
import schemaV0_11_0 from '../schemas/v0.11.0.json'

const ADDRESS = '0xb6BAd41ae76A11D10f7b0E664C5007b908bC77C9'
const REFERRER_V0_1_0 = { address: ADDRESS, version: '0.1.0' }
Expand Down Expand Up @@ -552,6 +553,80 @@ describe('Schema v0.10.0', () => {
)
})

describe('Schema v0.11.0', () => {
const ajv = new Ajv()
const validator = ajv.compile(schemaV0_11_0)

const BASE_DOCUMENT = {
version: '0.11.0',
metadata: {},
}

test('Minimal valid schema', _buildAssertValidFn(validator, BASE_DOCUMENT))

test(
'With widget v0.11.0',
_buildAssertValidFn(validator, {
...BASE_DOCUMENT,
metadata: { widget: { appCode: 'Pig Swap', environment: 'production' } },
})
)

test(
'With widget and no environment v0.11.0',
_buildAssertValidFn(validator, {
...BASE_DOCUMENT,
metadata: { widget: { appCode: 'Pig Swap' } },
})
)

test(
'Widget with no appCode v0.11.0',
_buildAssertInvalidFn(
validator,
{
...BASE_DOCUMENT,
metadata: {
widget: {
environment: 'production',
},
},
},
[
{
instancePath: '/metadata/widget',
keyword: 'required',
message: "must have required property 'appCode'",
params: { missingProperty: 'appCode' },
schemaPath: '#/properties/metadata/properties/widget/required',
},
]
)
)

test(
'Signer with invalid address',
_buildAssertInvalidFn(
validator,
{
...BASE_DOCUMENT,
metadata: {
signer: '0xinvalid',
},
},
[
{
instancePath: '/metadata/signer',
keyword: 'pattern',
message: 'must match pattern "^0x[a-fA-F0-9]{40}$"',
params: { pattern: '^0x[a-fA-F0-9]{40}$' },
schemaPath: '#/properties/metadata/properties/signer/pattern',
},
]
)
)
})

function _buildAssertValidFn(validator: ValidateFunction, doc: any) {
return () => {
// when
Expand Down
Loading