add skills
This commit is contained in:
+236
@@ -0,0 +1,236 @@
|
||||
# Gasless Transactions
|
||||
|
||||
Polymarket's **Relayer Client** enables gasless transactions. Instead of requiring users to hold POL, Polymarket's infrastructure pays gas fees. Users only need USDC.e to trade.
|
||||
|
||||
Requires **Builder Program** membership. You need Builder API credentials.
|
||||
|
||||
## How It Works
|
||||
|
||||
1. Your app creates a transaction
|
||||
2. User signs it with their private key
|
||||
3. App sends to Polymarket's relayer
|
||||
4. Relayer submits onchain and pays gas
|
||||
5. Transaction executes from the user's wallet
|
||||
|
||||
## What's Covered
|
||||
|
||||
| Operation | Description |
|
||||
|-----------|-------------|
|
||||
| Wallet deployment | Deploy Safe or Proxy wallets for new users |
|
||||
| Token approvals | Approve contracts to spend USDC.e or outcome tokens |
|
||||
| CTF operations | Split, merge, redeem positions |
|
||||
| Transfers | Move tokens between addresses |
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
# TypeScript
|
||||
npm install @polymarket/builder-relayer-client @polymarket/builder-signing-sdk
|
||||
|
||||
# Python
|
||||
pip install py-builder-relayer-client py-builder-signing-sdk
|
||||
```
|
||||
|
||||
## Client Setup
|
||||
|
||||
### TypeScript (Local Signing)
|
||||
|
||||
```typescript
|
||||
import { createWalletClient, http, Hex } from "viem";
|
||||
import { privateKeyToAccount } from "viem/accounts";
|
||||
import { polygon } from "viem/chains";
|
||||
import { RelayClient } from "@polymarket/builder-relayer-client";
|
||||
import { BuilderConfig } from "@polymarket/builder-signing-sdk";
|
||||
|
||||
const account = privateKeyToAccount(process.env.PRIVATE_KEY as Hex);
|
||||
const wallet = createWalletClient({
|
||||
account,
|
||||
chain: polygon,
|
||||
transport: http(process.env.RPC_URL),
|
||||
});
|
||||
|
||||
const builderConfig = new BuilderConfig({
|
||||
localBuilderCreds: {
|
||||
key: process.env.POLY_BUILDER_API_KEY!,
|
||||
secret: process.env.POLY_BUILDER_SECRET!,
|
||||
passphrase: process.env.POLY_BUILDER_PASSPHRASE!,
|
||||
},
|
||||
});
|
||||
|
||||
const client = new RelayClient(
|
||||
"https://relayer-v2.polymarket.com/",
|
||||
137,
|
||||
wallet,
|
||||
builderConfig
|
||||
);
|
||||
```
|
||||
|
||||
### Python (Local Signing)
|
||||
|
||||
```python
|
||||
import os
|
||||
from py_builder_relayer_client.client import RelayClient
|
||||
from py_builder_signing_sdk import BuilderConfig, BuilderApiKeyCreds
|
||||
|
||||
builder_config = BuilderConfig(
|
||||
local_builder_creds=BuilderApiKeyCreds(
|
||||
key=os.getenv("POLY_BUILDER_API_KEY"),
|
||||
secret=os.getenv("POLY_BUILDER_SECRET"),
|
||||
passphrase=os.getenv("POLY_BUILDER_PASSPHRASE"),
|
||||
)
|
||||
)
|
||||
|
||||
client = RelayClient(
|
||||
"https://relayer-v2.polymarket.com",
|
||||
137,
|
||||
os.getenv("PRIVATE_KEY"),
|
||||
builder_config,
|
||||
)
|
||||
```
|
||||
|
||||
### Remote Signing
|
||||
|
||||
Keep credentials on your server. Client points to signing endpoint:
|
||||
|
||||
```typescript
|
||||
// TypeScript
|
||||
const builderConfig = new BuilderConfig({
|
||||
remoteBuilderConfig: { url: "https://your-server.com/sign" },
|
||||
});
|
||||
|
||||
const client = new RelayClient(
|
||||
"https://relayer-v2.polymarket.com/",
|
||||
137,
|
||||
wallet,
|
||||
builderConfig
|
||||
);
|
||||
```
|
||||
|
||||
```python
|
||||
# Python
|
||||
from py_builder_signing_sdk import BuilderConfig, RemoteBuilderConfig
|
||||
|
||||
builder_config = BuilderConfig(
|
||||
remote_builder_config=RemoteBuilderConfig(url="https://your-server.com/sign")
|
||||
)
|
||||
|
||||
client = RelayClient("https://relayer-v2.polymarket.com", 137, pk, builder_config)
|
||||
```
|
||||
|
||||
## Wallet Types
|
||||
|
||||
| Type | Deployment | Best For |
|
||||
|------|------------|----------|
|
||||
| **Safe** | Call `deploy()` before first transaction | Most builder integrations |
|
||||
| **Proxy** | Auto-deploys on first transaction | Magic Link users |
|
||||
|
||||
```typescript
|
||||
// TypeScript — Safe wallet
|
||||
import { RelayClient, RelayerTxType } from "@polymarket/builder-relayer-client";
|
||||
|
||||
const client = new RelayClient(
|
||||
"https://relayer-v2.polymarket.com/",
|
||||
137,
|
||||
wallet,
|
||||
builderConfig,
|
||||
RelayerTxType.SAFE
|
||||
);
|
||||
|
||||
// Deploy before first transaction
|
||||
const response = await client.deploy();
|
||||
const result = await response.wait();
|
||||
console.log("Safe Address:", result?.proxyAddress);
|
||||
```
|
||||
|
||||
```python
|
||||
# Python — Safe wallet
|
||||
response = client.deploy()
|
||||
result = response.wait()
|
||||
print("Safe Address:", result.get("proxyAddress"))
|
||||
```
|
||||
|
||||
## Executing Transactions
|
||||
|
||||
```typescript
|
||||
interface Transaction {
|
||||
to: string; // Target contract address
|
||||
data: string; // Encoded function call
|
||||
value: string; // POL to send (usually "0")
|
||||
}
|
||||
|
||||
const response = await client.execute(transactions, "Description");
|
||||
const result = await response.wait();
|
||||
```
|
||||
|
||||
### Token Approval Example
|
||||
|
||||
```typescript
|
||||
import { encodeFunctionData, maxUint256 } from "viem";
|
||||
|
||||
const USDC = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
|
||||
const CTF = "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045";
|
||||
|
||||
const approveTx = {
|
||||
to: USDC,
|
||||
data: encodeFunctionData({
|
||||
abi: [{
|
||||
name: "approve", type: "function",
|
||||
inputs: [{ name: "spender", type: "address" }, { name: "amount", type: "uint256" }],
|
||||
outputs: [{ type: "bool" }],
|
||||
}],
|
||||
functionName: "approve",
|
||||
args: [CTF, maxUint256],
|
||||
}),
|
||||
value: "0",
|
||||
};
|
||||
|
||||
const response = await client.execute([approveTx], "Approve USDC.e for CTF");
|
||||
await response.wait();
|
||||
```
|
||||
|
||||
### Batch Transactions
|
||||
|
||||
Execute multiple operations atomically in a single call:
|
||||
|
||||
```typescript
|
||||
const response = await client.execute(
|
||||
[approveTx, transferTx],
|
||||
"Approve and transfer"
|
||||
);
|
||||
await response.wait();
|
||||
```
|
||||
|
||||
## Transaction States
|
||||
|
||||
| State | Terminal | Description |
|
||||
|-------|----------|-------------|
|
||||
| `STATE_NEW` | No | Received by relayer |
|
||||
| `STATE_EXECUTED` | No | Submitted onchain |
|
||||
| `STATE_MINED` | No | Included in a block |
|
||||
| `STATE_CONFIRMED` | Yes | Finalized successfully |
|
||||
| `STATE_FAILED` | Yes | Failed permanently |
|
||||
| `STATE_INVALID` | Yes | Rejected as invalid |
|
||||
|
||||
## Builder Setup
|
||||
|
||||
1. Go to polymarket.com/settings?tab=builder
|
||||
2. Create builder profile + generate API keys
|
||||
3. Implement builder signing in your CLOB client
|
||||
4. All orders automatically attributed to your builder account
|
||||
|
||||
## Contract Addresses
|
||||
|
||||
| Contract | Address | Approval Needed |
|
||||
|----------|---------|-----------------|
|
||||
| USDC.e (Bridged USDC) | `0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174` | — |
|
||||
| CTF | `0x4D97DCd97eC945f40cF65F87097ACe5EA0476045` | USDC.e |
|
||||
| CTF Exchange | `0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E` | USDC.e, Tokens |
|
||||
| Neg Risk CTF Exchange | `0xC5d563A36AE78145C45a50134d48A1215220f80a` | USDC.e, Tokens |
|
||||
| Neg Risk Adapter | `0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296` | Tokens |
|
||||
|
||||
## SDKs
|
||||
|
||||
- [Builder Relayer Client (TypeScript)](https://github.com/Polymarket/builder-relayer-client)
|
||||
- [Builder Relayer Client (Python)](https://github.com/Polymarket/py-builder-relayer-client)
|
||||
- [Builder Signing SDK (TypeScript)](https://github.com/Polymarket/builder-signing-sdk)
|
||||
- [Builder Signing SDK (Python)](https://github.com/Polymarket/py-builder-signing-sdk)
|
||||
Reference in New Issue
Block a user