From fb811e080da91b9ea853d466872521b45d88494c Mon Sep 17 00:00:00 2001 From: Rodrigo <95635797+poly-rodr@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:32:14 -0300 Subject: [PATCH 1/5] Reward service endpoints --- examples/rewards.ts | 35 +++++++++++++++++++++++++++ package.json | 2 +- src/client.ts | 58 +++++++++++++++++++++++++++++++++++++++++++++ src/endpoints.ts | 6 +++++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 examples/rewards.ts diff --git a/examples/rewards.ts b/examples/rewards.ts new file mode 100644 index 0000000..ed99a1d --- /dev/null +++ b/examples/rewards.ts @@ -0,0 +1,35 @@ +import { ethers } from "ethers"; +import { config as dotenvConfig } from "dotenv"; +import { resolve } from "path"; +import { ApiKeyCreds, Chain, ClobClient } from "../src"; + +dotenvConfig({ path: resolve(__dirname, "../.env") }); + +async function main() { + const wallet = new ethers.Wallet(`${process.env.PK}`); + const chainId = parseInt(`${process.env.CHAIN_ID || Chain.MUMBAI}`) as Chain; + console.log(`Address: ${await wallet.getAddress()}, chainId: ${chainId}`); + + const host = process.env.CLOB_API_URL || "http://localhost:8080"; + const creds: ApiKeyCreds = { + key: `${process.env.CLOB_API_KEY}`, + secret: `${process.env.CLOB_SECRET}`, + passphrase: `${process.env.CLOB_PASS_PHRASE}`, + }; + const clobClient = new ClobClient(host, chainId, wallet, creds); + + console.log( + "today earnings", + await clobClient.getEarningsForUserForDay("2024-03-22" /* UTC TIME */), + ); + console.log("rewards percentages", await clobClient.getLiquidityRewardPercentages()); + console.log("current rewards", await clobClient.getCurrentRewards()); + console.log( + "rewards for market", + await clobClient.getRawRewardsForMarket( + "0xbd31dc8a20211944f6b70f31557f1001557b59905b7738480ca09bd4532f84af", + ), + ); +} + +main(); diff --git a/package.json b/package.json index 381d46d..909b253 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@polymarket/clob-client", "description": "Typescript client for Polymarket's CLOB", - "version": "4.3.0", + "version": "4.4.0", "contributors": [ { "name": "Jonathan Amenechi", diff --git a/src/client.ts b/src/client.ts index 55575f1..3876676 100644 --- a/src/client.ts +++ b/src/client.ts @@ -89,6 +89,10 @@ import { GET_MIDPOINTS, GET_PRICES, GET_LAST_TRADES_PRICES, + GET_EARNINGS_FOR_USER_FOR_DAY, + GET_LIQUIDITY_REWARD_PERCENTAGES, + GET_REWARDS_MARKETS_CURRENT, + GET_REWARDS_MARKETS, } from "./endpoints"; import { OrderBuilder } from "./order-builder/builder"; @@ -657,6 +661,60 @@ export class ClobClient { }); } + // Rewards + public async getEarningsForUserForDay(date: string): Promise { + this.canL2Auth(); + + const endpoint = GET_EARNINGS_FOR_USER_FOR_DAY; + const headerArgs = { + method: GET, + requestPath: endpoint, + }; + + const headers = await createL2Headers( + this.signer as Wallet | JsonRpcSigner, + this.creds as ApiKeyCreds, + headerArgs, + ); + + const _params = { + date, + signature_type: this.orderBuilder.signatureType, + }; + + return this.get(`${this.host}${endpoint}`, { headers, params: _params }); + } + + public async getLiquidityRewardPercentages(): Promise { + this.canL2Auth(); + + const endpoint = GET_LIQUIDITY_REWARD_PERCENTAGES; + const headerArgs = { + method: GET, + requestPath: endpoint, + }; + + const headers = await createL2Headers( + this.signer as Wallet | JsonRpcSigner, + this.creds as ApiKeyCreds, + headerArgs, + ); + + const _params = { + signature_type: this.orderBuilder.signatureType, + }; + + return this.get(`${this.host}${endpoint}`, { headers, params: _params }); + } + + public async getCurrentRewards(): Promise { + return this.get(`${this.host}${GET_REWARDS_MARKETS_CURRENT}`); + } + + public async getRawRewardsForMarket(conditionId: string): Promise { + return this.get(`${this.host}${GET_REWARDS_MARKETS}${conditionId}`); + } + public async getMarketTradesEvents(conditionID: string): Promise { return this.get(`${this.host}${GET_MARKET_TRADES_EVENTS}${conditionID}`); } diff --git a/src/endpoints.ts b/src/endpoints.ts index b0faaa6..41d8207 100644 --- a/src/endpoints.ts +++ b/src/endpoints.ts @@ -48,3 +48,9 @@ export const GET_BALANCE_ALLOWANCE = "/balance-allowance"; // Live activity export const GET_MARKET_TRADES_EVENTS = "/live-activity/events/"; + +// Rewards +export const GET_EARNINGS_FOR_USER_FOR_DAY = "/rewards/user"; +export const GET_LIQUIDITY_REWARD_PERCENTAGES = "/rewards/user/percentages"; +export const GET_REWARDS_MARKETS_CURRENT = "/rewards/markets/current"; +export const GET_REWARDS_MARKETS = "/rewards/markets/"; From 3c6fc350bff47c7e89bc883f8874b75f195724cd Mon Sep 17 00:00:00 2001 From: Rodrigo <95635797+poly-rodr@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:04:22 -0300 Subject: [PATCH 2/5] including types --- src/client.ts | 12 ++++++++---- src/types.ts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/client.ts b/src/client.ts index 3876676..1b99409 100644 --- a/src/client.ts +++ b/src/client.ts @@ -33,6 +33,10 @@ import { MarketTradeEvent, DropNotificationParams, BookParams, + UserEarning, + RewardsPercentages, + CurrentReward, + MarketReward, } from "./types"; import { createL1Headers, createL2Headers } from "./headers"; import { @@ -662,7 +666,7 @@ export class ClobClient { } // Rewards - public async getEarningsForUserForDay(date: string): Promise { + public async getEarningsForUserForDay(date: string): Promise { this.canL2Auth(); const endpoint = GET_EARNINGS_FOR_USER_FOR_DAY; @@ -685,7 +689,7 @@ export class ClobClient { return this.get(`${this.host}${endpoint}`, { headers, params: _params }); } - public async getLiquidityRewardPercentages(): Promise { + public async getLiquidityRewardPercentages(): Promise { this.canL2Auth(); const endpoint = GET_LIQUIDITY_REWARD_PERCENTAGES; @@ -707,11 +711,11 @@ export class ClobClient { return this.get(`${this.host}${endpoint}`, { headers, params: _params }); } - public async getCurrentRewards(): Promise { + public async getCurrentRewards(): Promise { return this.get(`${this.host}${GET_REWARDS_MARKETS_CURRENT}`); } - public async getRawRewardsForMarket(conditionId: string): Promise { + public async getRawRewardsForMarket(conditionId: string): Promise { return this.get(`${this.host}${GET_REWARDS_MARKETS}${conditionId}`); } diff --git a/src/types.ts b/src/types.ts index 0e9b8b3..0ebf4ba 100644 --- a/src/types.ts +++ b/src/types.ts @@ -390,3 +390,35 @@ export interface BookParams { token_id: string; side: Side; } + +export interface UserEarning { + date: string; + market: string; + asset_address: string; + maker_address: string; + earnings: number; +} + +export interface RewardsPercentages { + [market: string]: number; +} + +export interface CurrentReward { + market: string; + asset_address: string; + start_date: string; + end_date: string; + current_rewards_per_day: number; + total_reward_amount: number; + remaining_reward_amount: number; +} + +export interface MarketReward { + market: string; + asset_address: string; + start_date: string; + end_date: string; + rate_per_day: number; + total_rewards: number; + total_days: number; +} From d4c4eb957d3aaccb5d064a08a2acc6e3b000e229 Mon Sep 17 00:00:00 2001 From: Rodrigo <95635797+poly-rodr@users.noreply.github.com> Date: Mon, 25 Mar 2024 18:43:32 -0300 Subject: [PATCH 3/5] pagination --- src/client.ts | 54 ++++++++++++++++++++++++++++++++++++++---------- src/constants.ts | 3 +++ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/client.ts b/src/client.ts index 1b99409..2855306 100644 --- a/src/client.ts +++ b/src/client.ts @@ -99,6 +99,7 @@ import { GET_REWARDS_MARKETS, } from "./endpoints"; import { OrderBuilder } from "./order-builder/builder"; +import { END_CURSOR, INITIAL_CURSOR } from "./constants"; export class ClobClient { readonly host: string; @@ -154,25 +155,27 @@ export class ClobClient { return this.get(`${this.host}${TIME}`); } - public async getSamplingSimplifiedMarkets(next_cursor = "MA=="): Promise { + public async getSamplingSimplifiedMarkets( + next_cursor = INITIAL_CURSOR, + ): Promise { return this.get(`${this.host}${GET_SAMPLING_SIMPLIFIED_MARKETS}`, { params: { next_cursor }, }); } - public async getSamplingMarkets(next_cursor = "MA=="): Promise { + public async getSamplingMarkets(next_cursor = INITIAL_CURSOR): Promise { return this.get(`${this.host}${GET_SAMPLING_MARKETS}`, { params: { next_cursor }, }); } - public async getSimplifiedMarkets(next_cursor = "MA=="): Promise { + public async getSimplifiedMarkets(next_cursor = INITIAL_CURSOR): Promise { return this.get(`${this.host}${GET_SIMPLIFIED_MARKETS}`, { params: { next_cursor }, }); } - public async getMarkets(next_cursor = "MA=="): Promise { + public async getMarkets(next_cursor = INITIAL_CURSOR): Promise { return this.get(`${this.host}${GET_MARKETS}`, { params: { next_cursor }, }); @@ -681,12 +684,23 @@ export class ClobClient { headerArgs, ); - const _params = { - date, - signature_type: this.orderBuilder.signatureType, - }; + let results: UserEarning[] = []; + let next_cursor = INITIAL_CURSOR; + while (next_cursor != END_CURSOR) { + const params = { + date, + signature_type: this.orderBuilder.signatureType, + next_cursor, + }; - return this.get(`${this.host}${endpoint}`, { headers, params: _params }); + const response = await this.get(`${this.host}${endpoint}`, { + headers, + params, + }); + next_cursor = response.next_cursor; + results = [...results, ...response.data]; + } + return results; } public async getLiquidityRewardPercentages(): Promise { @@ -712,11 +726,29 @@ export class ClobClient { } public async getCurrentRewards(): Promise { - return this.get(`${this.host}${GET_REWARDS_MARKETS_CURRENT}`); + let results: CurrentReward[] = []; + let next_cursor = INITIAL_CURSOR; + while (next_cursor != END_CURSOR) { + const response = await this.get(`${this.host}${GET_REWARDS_MARKETS_CURRENT}`, { + params: { next_cursor }, + }); + next_cursor = response.next_cursor; + results = [...results, ...response.data]; + } + return results; } public async getRawRewardsForMarket(conditionId: string): Promise { - return this.get(`${this.host}${GET_REWARDS_MARKETS}${conditionId}`); + let results: MarketReward[] = []; + let next_cursor = INITIAL_CURSOR; + while (next_cursor != END_CURSOR) { + const response = await this.get(`${this.host}${GET_REWARDS_MARKETS}${conditionId}`, { + params: { next_cursor }, + }); + next_cursor = response.next_cursor; + results = [...results, ...response.data]; + } + return results; } public async getMarketTradesEvents(conditionID: string): Promise { diff --git a/src/constants.ts b/src/constants.ts index 45914f9..b8d54ff 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -2,3 +2,6 @@ export const CREDS_CREATION_WARNING = `🚨🚨🚨 Your credentials CANNOT be recovered after they've been created. Be sure to store them safely! 🚨🚨🚨`; + +export const INITIAL_CURSOR = "MA=="; +export const END_CURSOR = "LTE="; From b4a33336e5b1354e0920ba12f895c6a006128d5b Mon Sep 17 00:00:00 2001 From: Rodrigo <95635797+poly-rodr@users.noreply.github.com> Date: Tue, 26 Mar 2024 20:25:32 -0300 Subject: [PATCH 4/5] naming --- examples/rewards.ts | 2 +- src/client.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/rewards.ts b/examples/rewards.ts index ed99a1d..aed5114 100644 --- a/examples/rewards.ts +++ b/examples/rewards.ts @@ -22,7 +22,7 @@ async function main() { "today earnings", await clobClient.getEarningsForUserForDay("2024-03-22" /* UTC TIME */), ); - console.log("rewards percentages", await clobClient.getLiquidityRewardPercentages()); + console.log("rewards percentages", await clobClient.getLRewardPercentages()); console.log("current rewards", await clobClient.getCurrentRewards()); console.log( "rewards for market", diff --git a/src/client.ts b/src/client.ts index 2855306..ca439ec 100644 --- a/src/client.ts +++ b/src/client.ts @@ -703,7 +703,7 @@ export class ClobClient { return results; } - public async getLiquidityRewardPercentages(): Promise { + public async getLRewardPercentages(): Promise { this.canL2Auth(); const endpoint = GET_LIQUIDITY_REWARD_PERCENTAGES; From b31d2f1fe47800018ee7269a375ede8adf383f55 Mon Sep 17 00:00:00 2001 From: Rodrigo <95635797+poly-rodr@users.noreply.github.com> Date: Wed, 3 Apr 2024 13:16:02 -0300 Subject: [PATCH 5/5] asset rate --- examples/rewards.ts | 2 +- src/types.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/rewards.ts b/examples/rewards.ts index aed5114..08ac7dd 100644 --- a/examples/rewards.ts +++ b/examples/rewards.ts @@ -20,7 +20,7 @@ async function main() { console.log( "today earnings", - await clobClient.getEarningsForUserForDay("2024-03-22" /* UTC TIME */), + await clobClient.getEarningsForUserForDay("2024-04-03" /* UTC TIME */), ); console.log("rewards percentages", await clobClient.getLRewardPercentages()); console.log("current rewards", await clobClient.getCurrentRewards()); diff --git a/src/types.ts b/src/types.ts index 0ebf4ba..1a30473 100644 --- a/src/types.ts +++ b/src/types.ts @@ -397,6 +397,7 @@ export interface UserEarning { asset_address: string; maker_address: string; earnings: number; + asset_rate: number; } export interface RewardsPercentages {