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 partner fee meta-data #53

Merged
merged 13 commits into from
Feb 22, 2024
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const appDataDoc = await metadataApi.generateAppDataDoc({
metadata: {
referrer,
quote,
orderClass
orderClass,
},
})

Expand Down Expand Up @@ -152,16 +152,19 @@ Fork the repo so you can create a new PR. Then:
- Version it using the [semver](https://semver.org/) convention
- You will need to create the new file for the meta-data schema: `<meta-data-name>/<new-version>.json`
- Update it in the main schema you just created in step 1: Set it to `"<meta-data-name>": { "$ref": "<meta-data-name>/<new-version>.json#" }`
- 🚨 IMPORTANT: Don't forget to add the exported constant with the latest version in:
- https://github.com/cowprotocol/app-data/blob/widget-metadata/src/scripts/compile.ts#L68

4. Modify the `compile.ts` script

- Add the exported constant with the latest version in, and the new metadata:
- For example: https://github.com/cowprotocol/app-data/pull/44/commits/aeef8a58e7bbd2a53664ce396011cb157a18406d
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unrelated: this link was just broken


4. Generate the typescript types

- Run `yarn build`

4. Make a test focusing on the new or modified meta-data:
5. Make a test focusing on the new or modified meta-data:

- https://github.com/cowprotocol/app-data/pull/44/files#diff-e755a2ecce42f09829d5c7dc1de8853d1d00ef56eaadc2709601c87b9be8ddfbR556
- Don't forget to use the right version of the schema in your test: https://github.com/cowprotocol/app-data/pull/44/files#diff-e755a2ecce42f09829d5c7dc1de8853d1d00ef56eaadc2709601c87b9be8ddfbR11

5. Create the PR and document it together with the motivation for the changes
6. Create the PR and document it together with the motivation for the changes
10 changes: 7 additions & 3 deletions src/generatedTypes/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,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_12_0 from './v0.12.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 @@ -12,19 +13,21 @@ 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.11.0'
export * as latest from './v0.12.0'

export const LATEST_APP_DATA_VERSION = '0.11.0'
export const LATEST_APP_DATA_VERSION = '0.12.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'
export const LATEST_WIDGET_METADATA_VERSION = '0.1.0'
export const LATEST_PARTNER_FEE_METADATA_VERSION = '0.1.0'

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

export {
v0_12_0,
v0_11_0,
v0_10_0,
v0_9_0,
Expand Down
154 changes: 154 additions & 0 deletions src/generatedTypes/v0.12.0.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/* 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;
/**
* The fee in basis points (BPS) to be paid to the partner. One basis point is equivalent to 0.01% (1/100th of a percent)
*/
export type BasisPointBPS = number;
/**
* The Ethereum address of the partner to receive the fee.
*/
export type PartnerAccount = 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;
partnerFee?: PartnerFee;
}
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;
}
export interface PartnerFee {
bips: BasisPointBPS;
recipient: PartnerAccount;
[k: string]: unknown;
}
24 changes: 12 additions & 12 deletions src/schemas/definitions.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,32 @@
"$id": "#/definitions/version",
"description": "Semantic versioning of document.",
"readOnly": true,
"examples": [
"1.0.0",
"1.2.3"
],
"examples": ["1.0.0", "1.2.3"],
"title": "Version",
"type": "string"
},
"ethereumAddress": {
"$id": "#/definitions/ethereumAddress",
"pattern": "^0x[a-fA-F0-9]{40}$",
"title": "Ethereum compatible address",
"examples": [
"0xb6BAd41ae76A11D10f7b0E664C5007b908bC77C9"
],
"examples": ["0xb6BAd41ae76A11D10f7b0E664C5007b908bC77C9"],
"type": "string"
},
"bigNumber": {
"$id": "#/definitions/bigNumber",
"pattern": "^\\d+$",
"title": "BigNumber",
"examples": [
"90741097240912730913",
"0",
"75891372"
],
"examples": ["90741097240912730913", "0", "75891372"],
"type": "string"
},
"bips": {
"$id": "#/definitions/bips",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you use this definition in the quote slippageBips ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did the other way around here: #55

"title": "Basis Point (BPS)",
"description": "One basis point is equivalent to 0.01% (1/100th of a percent)",
"examples": [0, 10, 50],
"type": "integer",
"maximum": 10000,
"minimum": 0
}
}
}
19 changes: 19 additions & 0 deletions src/schemas/partnerFee/v0.1.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"$id": "#partnerFee/v0.1.0.json",
"$schema": "http://json-schema.org/draft-07/schema",
"required": ["bips", "recipient"],
"title": "Partner fee",
"type": "object",
"properties": {
"bips": {
"title": "Basis Point (BPS)",
"description": "The fee in basis points (BPS) to be paid to the partner. One basis point is equivalent to 0.01% (1/100th of a percent)",
"$ref": "../definitions.json#/definitions/bips"
},
"recipient": {
"$ref": "../definitions.json#/definitions/ethereumAddress",
"title": "Partner account",
"description": "The Ethereum address of the partner to receive the fee."
}
}
}
65 changes: 65 additions & 0 deletions src/schemas/v0.12.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
{
"$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#"
},
"partnerFee": {
"$ref": "partnerFee/v0.1.0.json#"
}
}
}
}
}
4 changes: 3 additions & 1 deletion src/scripts/compile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ async function compile(): Promise<void> {
const latestHooksVersion = await getLatestMetadataDocVersion('hooks')
const latestSignerVersion = await getLatestMetadataDocVersion('signer')
const latestWidgetVersion = await getLatestMetadataDocVersion('widget')
const latestPartnerFeeVersion = await getLatestMetadataDocVersion('partnerFee')

const additionalTypesExport = `
export * as latest from './${latest}'
Expand All @@ -76,6 +77,7 @@ 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 const LATEST_PARTNER_FEE_METADATA_VERSION = '${extractSemver(latestPartnerFeeVersion)}'

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

async function getLatestMetadataDocVersion(
metadataDocName: 'quote' | 'referrer' | 'orderClass' | 'utm' | 'hooks' | 'signer' | 'widget'
metadataDocName: 'quote' | 'referrer' | 'orderClass' | 'utm' | 'hooks' | 'signer' | 'widget' | 'partnerFee'
): Promise<string> {
const metadataPath = path.join(SCHEMAS_SRC_PATH, metadataDocName)
const versions = await fs.promises.readdir(metadataPath)
Expand Down
Loading
Loading