@renegade-fi/renegade-sdk 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/biome.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
3
+ "files": {
4
+ "ignore": [
5
+ "CHANGELOG.md",
6
+ "pnpm-lock.yaml",
7
+ "package.json",
8
+ "tsconfig.base.json",
9
+ "wasm/**",
10
+ "dist/**",
11
+ "renegade-utils/**",
12
+ "*.d.ts"
13
+ ]
14
+ },
15
+ "formatter": {
16
+ "indentStyle": "space",
17
+ "indentWidth": 4,
18
+ "lineWidth": 100
19
+ },
20
+ "linter": {
21
+ "rules": {
22
+ "recommended": true,
23
+ "correctness": {
24
+ "noUnusedVariables": "error",
25
+ "useExhaustiveDependencies": "error",
26
+ "noUnusedImports": "error"
27
+ },
28
+ "style": {
29
+ "useShorthandArrayType": "error"
30
+ },
31
+ "suspicious": {
32
+ "noExplicitAny": "off"
33
+ }
34
+ }
35
+ },
36
+ "organizeImports": {
37
+ "enabled": true
38
+ },
39
+ "vcs": {
40
+ "enabled": true,
41
+ "clientKind": "git",
42
+ "useIgnoreFile": true
43
+ }
44
+ }
package/examples/basic.ts CHANGED
@@ -1,43 +1,39 @@
1
1
  /**
2
2
  * Basic example of using the Renegade External Match Client
3
- *
3
+ *
4
4
  * This example demonstrates how to create a client, request a quote, assemble a match, and submit the transaction on-chain.
5
5
  */
6
6
 
7
- import {
8
- ExternalMatchClient,
9
- OrderSide,
10
- } from '../index';
11
- import type { ExternalOrder } from '../index';
12
- import { stringifyBigJSON } from '../src/http';
7
+ import { ExternalMatchClient, OrderSide } from "../index";
8
+ import type { ExternalOrder } from "../index";
13
9
 
14
10
  // Viem imports for on-chain transactions
15
- import { http, createWalletClient } from 'viem';
16
- import { privateKeyToAccount } from 'viem/accounts';
17
- import { arbitrumSepolia } from 'viem/chains';
11
+ import { http, createWalletClient } from "viem";
12
+ import { privateKeyToAccount } from "viem/accounts";
13
+ import { arbitrumSepolia } from "viem/chains";
18
14
 
19
15
  // Get API credentials from environment variables
20
- const API_KEY = process.env.EXTERNAL_MATCH_KEY || '';
21
- const API_SECRET = process.env.EXTERNAL_MATCH_SECRET || '';
22
- const PRIVATE_KEY = process.env.PKEY || '';
23
- const RPC_URL = process.env.RPC_URL || 'https://sepolia-rollup.arbitrum.io/rpc';
16
+ const API_KEY = process.env.EXTERNAL_MATCH_KEY || "";
17
+ const API_SECRET = process.env.EXTERNAL_MATCH_SECRET || "";
18
+ const PRIVATE_KEY = process.env.PKEY || "";
19
+ const RPC_URL = process.env.RPC_URL || "https://sepolia-rollup.arbitrum.io/rpc";
24
20
 
25
21
  // Validate API credentials
26
22
  if (!API_KEY || !API_SECRET) {
27
- console.error('Error: Missing API credentials');
28
- console.error('Please set EXTERNAL_MATCH_KEY and EXTERNAL_MATCH_SECRET environment variables');
23
+ console.error("Error: Missing API credentials");
24
+ console.error("Please set EXTERNAL_MATCH_KEY and EXTERNAL_MATCH_SECRET environment variables");
29
25
  process.exit(1);
30
26
  }
31
27
 
32
28
  // Validate wallet private key
33
29
  if (!PRIVATE_KEY) {
34
- console.error('Error: Missing private key');
35
- console.error('Please set PRIVATE_KEY environment variable');
30
+ console.error("Error: Missing private key");
31
+ console.error("Please set PKEY environment variable");
36
32
  process.exit(1);
37
33
  }
38
34
 
39
35
  // Set up wallet client for blockchain transactions
40
- const privateKey = PRIVATE_KEY.startsWith('0x') ? PRIVATE_KEY : `0x${PRIVATE_KEY}`;
36
+ const privateKey = PRIVATE_KEY.startsWith("0x") ? PRIVATE_KEY : `0x${PRIVATE_KEY}`;
41
37
  const walletClient = createWalletClient({
42
38
  account: privateKeyToAccount(privateKey as `0x${string}`),
43
39
  chain: arbitrumSepolia,
@@ -45,13 +41,13 @@ const walletClient = createWalletClient({
45
41
  });
46
42
 
47
43
  // Create the external match client
48
- console.log('API KEY', API_KEY);
44
+ console.log("API KEY", API_KEY);
49
45
  const client = ExternalMatchClient.newSepoliaClient(API_KEY, API_SECRET);
50
46
 
51
47
  // Example order for USDC/WETH pair
52
48
  const order: ExternalOrder = {
53
- quote_mint: '0xdf8d259c04020562717557f2b5a3cf28e92707d1', // USDC
54
- base_mint: '0xc3414a7ef14aaaa9c4522dfc00a4e66e74e9c25a', // WETH
49
+ quote_mint: "0xdf8d259c04020562717557f2b5a3cf28e92707d1", // USDC
50
+ base_mint: "0xc3414a7ef14aaaa9c4522dfc00a4e66e74e9c25a", // WETH
55
51
  side: OrderSide.BUY,
56
52
  quote_amount: BigInt(20_000_000), // 20 USDC
57
53
  };
@@ -62,7 +58,7 @@ const order: ExternalOrder = {
62
58
  * @returns The transaction hash
63
59
  */
64
60
  async function submitTransaction(settlementTx: any): Promise<`0x${string}`> {
65
- console.log('Submitting transaction...');
61
+ console.log("Submitting transaction...");
66
62
 
67
63
  const tx = await walletClient.sendTransaction({
68
64
  to: settlementTx.to as `0x${string}`,
@@ -77,45 +73,45 @@ async function submitTransaction(settlementTx: any): Promise<`0x${string}`> {
77
73
  async function fullExample() {
78
74
  try {
79
75
  // Step 1: Request a quote
80
- console.log('Requesting quote...');
76
+ console.log("Requesting quote...");
81
77
  const quote = await client.requestQuote(order);
82
78
 
83
79
  if (!quote) {
84
- console.log('No quote available');
80
+ console.log("No quote available");
85
81
  return;
86
82
  }
87
83
 
88
- console.log('Quote received!');
84
+ console.log("Quote received!");
89
85
 
90
86
  // Step 2: Assemble the quote into a match bundle
91
- console.log('Assembling match...');
87
+ console.log("Assembling match...");
92
88
  const bundle = await client.assembleQuote(quote);
93
89
 
94
90
  if (!bundle) {
95
- console.log('No match available');
91
+ console.log("No match available");
96
92
  return;
97
93
  }
98
94
 
99
- console.log('Match assembled!');
95
+ console.log("Match assembled!");
100
96
 
101
97
  // Step 3: Submit the transaction on-chain
102
98
  const txHash = await submitTransaction(bundle.match_bundle.settlement_tx);
103
99
  console.log(
104
- 'Transaction submitted:',
105
- `${walletClient.chain.blockExplorers?.default.url}/tx/${txHash}`
100
+ "Transaction submitted:",
101
+ `${walletClient.chain.blockExplorers?.default.url}/tx/${txHash}`,
106
102
  );
107
103
  } catch (error) {
108
- console.error('Error:', error);
104
+ console.error("Error:", error);
109
105
  }
110
106
  }
111
107
 
112
108
  // Run the examples
113
109
  async function main() {
114
- console.log('Running full example with on-chain submission...');
110
+ console.log("Running full example with on-chain submission...");
115
111
  await fullExample();
116
112
  }
117
113
 
118
114
  // Only run if this file is being executed directly
119
115
  if (require.main === module) {
120
116
  main().catch(console.error);
121
- }
117
+ }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Fetch a quote from the external api and execute a malleable match
3
+ *
4
+ * Malleable matches allow the exact swap amount to be determined at settlement
5
+ * time within a predefined range, offering more flexibility than standard
6
+ * matches.
7
+ */
8
+
9
+ import { ExternalMatchClient, OrderSide } from "../index";
10
+ import type { ExternalOrder } from "../index";
11
+
12
+ // Viem imports for on-chain transactions
13
+ import { http, createWalletClient } from "viem";
14
+ import { privateKeyToAccount } from "viem/accounts";
15
+ import { arbitrumSepolia } from "viem/chains";
16
+
17
+ // Get API credentials from environment variables
18
+ const API_KEY = process.env.EXTERNAL_MATCH_KEY || "";
19
+ const API_SECRET = process.env.EXTERNAL_MATCH_SECRET || "";
20
+ const PRIVATE_KEY = process.env.PKEY || "";
21
+ const RPC_URL = process.env.RPC_URL || "https://sepolia-rollup.arbitrum.io/rpc";
22
+
23
+ // Validate API credentials
24
+ if (!API_KEY || !API_SECRET) {
25
+ console.error("Error: Missing API credentials");
26
+ console.error("Please set EXTERNAL_MATCH_KEY and EXTERNAL_MATCH_SECRET environment variables");
27
+ process.exit(1);
28
+ }
29
+
30
+ // Validate wallet private key
31
+ if (!PRIVATE_KEY) {
32
+ console.error("Error: Missing private key");
33
+ console.error("Please set PKEY environment variable");
34
+ process.exit(1);
35
+ }
36
+
37
+ // Set up wallet client for blockchain transactions
38
+ const privateKey = PRIVATE_KEY.startsWith("0x") ? PRIVATE_KEY : `0x${PRIVATE_KEY}`;
39
+ const walletClient = createWalletClient({
40
+ account: privateKeyToAccount(privateKey as `0x${string}`),
41
+ chain: arbitrumSepolia,
42
+ transport: http(RPC_URL),
43
+ });
44
+
45
+ // Create the external match client
46
+ console.log("API KEY", API_KEY);
47
+ const client = ExternalMatchClient.newSepoliaClient(API_KEY, API_SECRET);
48
+
49
+ // Example order for USDC/WETH pair
50
+ const order: ExternalOrder = {
51
+ quote_mint: "0xdf8d259c04020562717557f2b5a3cf28e92707d1", // USDC
52
+ base_mint: "0xc3414a7ef14aaaa9c4522dfc00a4e66e74e9c25a", // WETH
53
+ side: OrderSide.SELL,
54
+ quote_amount: BigInt(20_000_000), // 20 USDC
55
+ };
56
+
57
+ /**
58
+ * Submit a transaction to the chain
59
+ * @param settlementTx The settlement transaction
60
+ * @returns The transaction hash
61
+ */
62
+ async function submitTransaction(settlementTx: any): Promise<`0x${string}`> {
63
+ console.log("Submitting transaction...");
64
+
65
+ const tx = await walletClient.sendTransaction({
66
+ to: settlementTx.to as `0x${string}`,
67
+ data: settlementTx.data as `0x${string}`,
68
+ value: settlementTx.value ? BigInt(settlementTx.value) : BigInt(0),
69
+ });
70
+
71
+ return tx;
72
+ }
73
+
74
+ async function fullExample() {
75
+ try {
76
+ // Step 1: Request a quote
77
+ console.log("Requesting quote...");
78
+ const quote = await client.requestQuote(order);
79
+
80
+ if (!quote) {
81
+ console.log("No quote available");
82
+ return;
83
+ }
84
+
85
+ console.log("Quote received!");
86
+
87
+ // Step 2: Assemble the quote into a match bundle
88
+ console.log("Assembling match...");
89
+ const bundle = await client.assembleMalleableQuote(quote);
90
+
91
+ if (!bundle) {
92
+ console.log("No match available");
93
+ return;
94
+ }
95
+
96
+ // Print bundle info
97
+ console.log("Bundle info:");
98
+ const [minBase, maxBase] = bundle.baseBounds();
99
+ console.log(`Base bounds: ${minBase} - ${maxBase}`);
100
+
101
+ // Pick a random base amount and see the send and receive amounts at that base amount
102
+ const dummyBaseAmount = randomInRange(minBase, maxBase);
103
+ const dummySendAmount = bundle.sendAmountAtBase(dummyBaseAmount);
104
+ const dummyReceiveAmount = bundle.receiveAmountAtBase(dummyBaseAmount);
105
+ console.log(`Hypothetical base amount: ${dummyBaseAmount}`);
106
+ console.log(`Hypothetical send amount: ${dummySendAmount}`);
107
+ console.log(`Hypothetical receive amount: ${dummyReceiveAmount}`);
108
+
109
+ // Pick an actual base amount to swap with
110
+ const swappedBaseAmount = randomInRange(minBase, maxBase);
111
+
112
+ // Setting the base amount will return the receive amount at the new base
113
+ // You can also call sendAmount and receiveAmount to get the amounts at the
114
+ // currently set base amount
115
+ const _recv = bundle.setBaseAmount(swappedBaseAmount);
116
+ const send = bundle.sendAmount();
117
+ const recv = bundle.receiveAmount();
118
+ console.log(`Swapped base amount: ${swappedBaseAmount}`);
119
+ console.log(`Send amount: ${send}`);
120
+ console.log(`Receive amount: ${recv}`);
121
+
122
+ // Step 3: Submit the transaction on-chain
123
+ const txHash = await submitTransaction(bundle.match_bundle.settlement_tx);
124
+ console.log(
125
+ "Transaction submitted:",
126
+ `${walletClient.chain.blockExplorers?.default.url}/tx/${txHash}`,
127
+ );
128
+ } catch (error) {
129
+ console.error("Error:", error);
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Generate a random value in the given range
135
+ */
136
+ function randomInRange(min: bigint, max: bigint): bigint {
137
+ return min + BigInt(Math.floor(Math.random() * (Number(max) - Number(min))));
138
+ }
139
+
140
+ // Run the examples
141
+ async function main() {
142
+ console.log("Running full example with on-chain submission...");
143
+ await fullExample();
144
+ }
145
+
146
+ // Only run if this file is being executed directly
147
+ if (require.main === module) {
148
+ main().catch(console.error);
149
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Example of using the Renegade External Match Client to fetch order book depth.
3
+ *
4
+ * This example demonstrates how to create a client and request order book depth for a given base token mint.
5
+ */
6
+
7
+ import { ExternalMatchClient } from "../index";
8
+ import type { OrderBookDepth } from "../src/types";
9
+
10
+ // Get API credentials from environment variables
11
+ const API_KEY = process.env.EXTERNAL_MATCH_KEY || "";
12
+ const API_SECRET = process.env.EXTERNAL_MATCH_SECRET || "";
13
+
14
+ // Validate API credentials
15
+ if (!API_KEY || !API_SECRET) {
16
+ console.error("Error: Missing API credentials");
17
+ console.error("Please set EXTERNAL_MATCH_KEY and EXTERNAL_MATCH_SECRET environment variables");
18
+ process.exit(1);
19
+ }
20
+
21
+ // Create the external match client
22
+ console.log("API KEY", API_KEY);
23
+ const client = ExternalMatchClient.newSepoliaClient(API_KEY, API_SECRET);
24
+
25
+ // Example base token mint (USDC)
26
+ const WETH = "0xc3414a7ef14aaaa9c4522dfc00a4e66e74e9c25a";
27
+
28
+ async function main() {
29
+ try {
30
+ console.log("Fetching order book depth for", WETH);
31
+ const depth = (await client.getOrderBookDepth(WETH)) as OrderBookDepth;
32
+ console.log("Order book depth:", JSON.stringify(depth, null, 2));
33
+ } catch (error) {
34
+ console.error("Error:", error);
35
+ }
36
+ }
37
+
38
+ // Only run if this file is being executed directly
39
+ if (require.main === module) {
40
+ main().catch(console.error);
41
+ }
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Basic example of using the Renegade External Match Client
3
+ *
4
+ * This example demonstrates how to create a client, request a quote, assemble a match, and submit the transaction on-chain.
5
+ */
6
+
7
+ import { AssembleExternalMatchOptions, ExternalMatchClient, OrderSide } from "../index";
8
+ import type { ExternalOrder } from "../index";
9
+
10
+ // Viem imports for on-chain transactions
11
+ import { http, createWalletClient } from "viem";
12
+ import { privateKeyToAccount } from "viem/accounts";
13
+ import { arbitrumSepolia } from "viem/chains";
14
+
15
+ // Get API credentials from environment variables
16
+ const API_KEY = process.env.EXTERNAL_MATCH_KEY || "";
17
+ const API_SECRET = process.env.EXTERNAL_MATCH_SECRET || "";
18
+ const PRIVATE_KEY = process.env.PKEY || "";
19
+ const RPC_URL = process.env.RPC_URL || "https://sepolia-rollup.arbitrum.io/rpc";
20
+
21
+ // Validate API credentials
22
+ if (!API_KEY || !API_SECRET) {
23
+ console.error("Error: Missing API credentials");
24
+ console.error("Please set EXTERNAL_MATCH_KEY and EXTERNAL_MATCH_SECRET environment variables");
25
+ process.exit(1);
26
+ }
27
+
28
+ // Validate wallet private key
29
+ if (!PRIVATE_KEY) {
30
+ console.error("Error: Missing private key");
31
+ console.error("Please set PKEY environment variable");
32
+ process.exit(1);
33
+ }
34
+
35
+ // Set up wallet client for blockchain transactions
36
+ const privateKey = PRIVATE_KEY.startsWith("0x") ? PRIVATE_KEY : `0x${PRIVATE_KEY}`;
37
+ const walletClient = createWalletClient({
38
+ account: privateKeyToAccount(privateKey as `0x${string}`),
39
+ chain: arbitrumSepolia,
40
+ transport: http(RPC_URL),
41
+ });
42
+
43
+ // Create the external match client
44
+ console.log("API KEY", API_KEY);
45
+ const client = ExternalMatchClient.newSepoliaClient(API_KEY, API_SECRET);
46
+
47
+ // Example order for USDC/WETH pair
48
+ const order: ExternalOrder = {
49
+ quote_mint: "0xdf8d259c04020562717557f2b5a3cf28e92707d1", // USDC
50
+ base_mint: "0xc3414a7ef14aaaa9c4522dfc00a4e66e74e9c25a", // WETH
51
+ side: OrderSide.BUY,
52
+ quote_amount: BigInt(20_000_000), // 20 USDC
53
+ };
54
+
55
+ /**
56
+ * Submit a transaction to the chain
57
+ * @param settlementTx The settlement transaction
58
+ * @returns The transaction hash
59
+ */
60
+ async function submitTransaction(settlementTx: any): Promise<`0x${string}`> {
61
+ console.log("Submitting transaction...");
62
+
63
+ const tx = await walletClient.sendTransaction({
64
+ to: settlementTx.to as `0x${string}`,
65
+ data: settlementTx.data as `0x${string}`,
66
+ value: settlementTx.value ? BigInt(settlementTx.value) : BigInt(0),
67
+ });
68
+
69
+ return tx;
70
+ }
71
+
72
+ // Run the examples
73
+ async function main() {
74
+ try {
75
+ // Step 1: Request a quote
76
+ console.log("Requesting quote...");
77
+ const quote = await client.requestQuote(order);
78
+
79
+ if (!quote) {
80
+ console.log("No quote available");
81
+ return;
82
+ }
83
+
84
+ console.log("Quote received!");
85
+
86
+ // Step 2: Assemble the quote into a match bundle
87
+ console.log("Assembling match...");
88
+ const options = AssembleExternalMatchOptions.new().withAllowShared(true);
89
+ const bundle = await client.assembleQuoteWithOptions(quote, options);
90
+
91
+ if (!bundle) {
92
+ console.log("No match available");
93
+ return;
94
+ }
95
+
96
+ console.log("Match assembled!");
97
+
98
+ // Step 3: Submit the transaction on-chain
99
+ const txHash = await submitTransaction(bundle.match_bundle.settlement_tx);
100
+ console.log(
101
+ "Transaction submitted:",
102
+ `${walletClient.chain.blockExplorers?.default.url}/tx/${txHash}`,
103
+ );
104
+ } catch (error) {
105
+ console.error("Error:", error);
106
+ }
107
+ }
108
+
109
+ // Only run if this file is being executed directly
110
+ if (require.main === module) {
111
+ main().catch(console.error);
112
+ }
package/index.ts CHANGED
@@ -4,7 +4,12 @@
4
4
  */
5
5
 
6
6
  // Export main client
7
- export { ExternalMatchClient, ExternalMatchClientError, RequestQuoteOptions, AssembleExternalMatchOptions } from './src/client';
7
+ export {
8
+ ExternalMatchClient,
9
+ ExternalMatchClientError,
10
+ RequestQuoteOptions,
11
+ AssembleExternalMatchOptions,
12
+ } from "./src/client";
8
13
 
9
14
  // Export types
10
15
  export type {
@@ -23,8 +28,8 @@ export type {
23
28
  ExternalQuoteRequest,
24
29
  ExternalQuoteResponse,
25
30
  AssembleExternalMatchRequest,
26
- ExternalMatchResponse
27
- } from './src/types';
31
+ ExternalMatchResponse,
32
+ } from "./src/types/index";
28
33
 
29
34
  // Export enums
30
- export { OrderSide } from './src/types';
35
+ export { OrderSide } from "./src/types/index";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renegade-fi/renegade-sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "A TypeScript client for interacting with the Renegade Darkpool API",
5
5
  "module": "index.ts",
6
6
  "type": "module",
@@ -9,7 +9,8 @@
9
9
  "scripts": {
10
10
  "build": "tsc -p tsconfig.build.json",
11
11
  "update-version": "bash scripts/update-version.sh",
12
- "prepublishOnly": "npm run update-version && npm run build"
12
+ "prepublishOnly": "npm run update-version && npm run build",
13
+ "check": "biome check --write ."
13
14
  },
14
15
  "keywords": [
15
16
  "renegade",
@@ -24,13 +25,14 @@
24
25
  "license": "MIT",
25
26
  "dependencies": {
26
27
  "@noble/hashes": "^1.7.1",
27
- "json-bigint": "^1.0.0"
28
+ "json-bigint": "^1.0.0",
29
+ "viem": "^2.23.15"
28
30
  },
29
31
  "devDependencies": {
32
+ "@biomejs/biome": "^1.9.4",
30
33
  "@types/bun": "latest",
31
34
  "@types/json-bigint": "^1.0.4",
32
- "typescript": "^5",
33
- "viem": "^2.23.15"
35
+ "typescript": "^5"
34
36
  },
35
37
  "repository": {
36
38
  "type": "git",
@@ -39,4 +41,4 @@
39
41
  "engines": {
40
42
  "node": ">=18"
41
43
  }
42
- }
44
+ }