Skip to content

Commit 708eba4

Browse files
committed
add ethers-v5 client entrypoint
1 parent e0587d1 commit 708eba4

7 files changed

Lines changed: 878 additions & 1 deletion

File tree

packages/client/package.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
"types": "./dist/decorators/index.d.ts",
2323
"default": "./dist/decorators/index.js"
2424
},
25+
"./ethers-v5": {
26+
"types": "./dist/ethers-v5.d.ts",
27+
"default": "./dist/ethers-v5.js"
28+
},
2529
"./viem": {
2630
"types": "./dist/viem/index.d.ts",
2731
"default": "./dist/viem/index.js"
@@ -38,6 +42,9 @@
3842
"decorators": [
3943
"./dist/decorators/index.d.ts"
4044
],
45+
"ethers-v5": [
46+
"./dist/ethers-v5.d.ts"
47+
],
4148
"viem": [
4249
"./dist/viem/index.d.ts"
4350
]
@@ -52,6 +59,7 @@
5259
"typecheck": "tsc -p tsconfig.json --noEmit"
5360
},
5461
"devDependencies": {
62+
"ethers-v5": "npm:ethers@^5.8.0",
5563
"tsup": "^8.5.1",
5664
"typescript": "^6.0.2",
5765
"viem": "^2.46.3"
@@ -61,9 +69,13 @@
6169
"access": "public"
6270
},
6371
"peerDependencies": {
72+
"ethers-v5": "^5.8.0",
6473
"viem": "^2.46.3"
6574
},
6675
"peerDependenciesMeta": {
76+
"ethers-v5": {
77+
"optional": true
78+
},
6779
"viem": {
6880
"optional": true
6981
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import {
2+
type AcceptedOrderResponse,
3+
OrderSide,
4+
OrderType,
5+
} from '@polymarket/bindings/clob';
6+
import { expectPresent } from '@polymarket/types';
7+
import { ethers } from 'ethers-v5';
8+
import { polygon } from 'viem/chains';
9+
import { describe, expect, it } from 'vitest';
10+
import {
11+
cancelOrder,
12+
fetchApiKeys,
13+
fetchMarket,
14+
prepareLimitOrderPosting,
15+
} from './actions';
16+
import { authenticateWith, completeWith } from './ethers-v5';
17+
import {
18+
publicClient,
19+
runMeteredTests,
20+
safeWalletAddress,
21+
testPrivateKey,
22+
} from './testing';
23+
24+
const TEST_MARKET_SLUG = 'eth-flipped-in-2026';
25+
26+
const provider = new ethers.providers.JsonRpcProvider(
27+
polygon.rpcUrls.default.http[0],
28+
{
29+
chainId: polygon.id,
30+
name: polygon.name,
31+
},
32+
);
33+
34+
function createSigner() {
35+
return new ethers.Wallet(testPrivateKey, provider);
36+
}
37+
38+
describe('ethers-v5', () => {
39+
describe('authenticateWith', () => {
40+
it('authenticates a secure client from an authentication workflow', async () => {
41+
const secureClient = await publicClient
42+
.beginAuthentication({ wallet: safeWalletAddress })
43+
.then(authenticateWith(createSigner()));
44+
45+
await expect(fetchApiKeys(secureClient)).resolves.toBeDefined();
46+
});
47+
});
48+
49+
describe('completeWith', () => {
50+
it.runIf(runMeteredTests)('places and cancels a limit order', async () => {
51+
const signer = createSigner();
52+
const market = await fetchMarket(publicClient, {
53+
slug: TEST_MARKET_SLUG,
54+
});
55+
const [yesTokenId] = expectPresent(market.clobTokenIds);
56+
const price = expectPresent(market.orderPriceMinTickSize);
57+
const size = expectPresent(market.orderMinSize);
58+
const secureClient = await publicClient
59+
.beginAuthentication({ wallet: safeWalletAddress })
60+
.then(authenticateWith(signer));
61+
62+
const response = await prepareLimitOrderPosting(secureClient, {
63+
orderType: OrderType.GTC,
64+
price,
65+
size,
66+
side: OrderSide.BUY,
67+
tokenId: yesTokenId,
68+
}).then(completeWith(signer));
69+
70+
expect(response.ok).toBe(true);
71+
const acceptedResponse = expectAcceptedOrderResponse(response);
72+
73+
await expect(
74+
cancelOrder(secureClient, { orderId: acceptedResponse.orderId }),
75+
).resolves.toEqual(
76+
expect.objectContaining({
77+
canceled: expect.arrayContaining([acceptedResponse.orderId]),
78+
}),
79+
);
80+
});
81+
});
82+
});
83+
84+
function expectAcceptedOrderResponse(response: unknown): AcceptedOrderResponse {
85+
expect(response).toEqual(expect.objectContaining({ ok: true }));
86+
87+
return response as AcceptedOrderResponse;
88+
}

0 commit comments

Comments
 (0)