@kehtus/proportion-sdk 0.1.0 → 0.1.1

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/arch.md CHANGED
@@ -11,6 +11,14 @@ This document is intentionally aligned to the code in:
11
11
 
12
12
  If documentation and Solidity diverge, Solidity is the source of truth.
13
13
 
14
+ ## Key Contract Integration Notes
15
+
16
+ - **Single Managed Signer:** Only `apiWallet` exists on FundedAccount. It is set by the relayer via `setApiWallet()`. No `riskEngineWallet` or `builderRiskEngineWallet`.
17
+ - **Unified Mode:** FundedAccount operates in Hyperliquid unified mode (shared spot + perp balance). Withdrawals use one-step `spotSend` instead of two-step `usdClassTransfer` + `spotSend`.
18
+ - **6dec Account Values:** `accountMarginSummary` returns 6dec. `highWaterMark`, `dayStartValue`, and drawdown floors are all 6dec. `spotBalance` and `spotSend` use 8dec.
19
+ - **Multi-DEX:** `PERP_DEX_COUNT = 2` replaces `PERP_DEX_INDEX = 0`. Account value is summed across all DEXes + spot.
20
+ - **`bridgeToEvm()`** is restricted to `Returning` state only (retry `spotSend` for stuck funds during close flow).
21
+
14
22
  ## Architecture
15
23
 
16
24
  The SDK has four runtime modules:
@@ -203,25 +211,22 @@ const config = await prop.account.getAccountConfig("0xAccount");
203
211
  Writes:
204
212
 
205
213
  ```ts
206
- await prop.account.setApiWallet("0xAccount", "0xWallet");
207
- await prop.account.setRiskEngineWallet("0xAccount", "0xWallet");
214
+ await prop.account.setApiWallet("0xAccount", "0xWallet"); // relayer-only
208
215
  await prop.account.requestWithdrawProfit("0xAccount");
209
216
  await prop.account.cancelSubscription("0xAccount");
210
- await prop.account.cancelStuckWithdrawal("0xAccount");
211
217
 
212
218
  await prop.account.checkpoint("0xAccount");
213
219
  await prop.account.initiateClose("0xAccount");
214
220
  await prop.account.initiateCloseForPerp("0xAccount", 0);
215
221
  await prop.account.initiateCloseAdmin("0xAccount");
216
222
  await prop.account.closeAndReturn("0xAccount");
223
+ await prop.account.bridgeToEvm("0xAccount"); // Returning state only — retry spotSend
217
224
  await prop.account.finalizeReturn("0xAccount");
218
225
  await prop.account.claimWithdrawal("0xAccount");
219
226
  await prop.account.claimSubscriptionFee("0xAccount");
220
227
  await prop.account.rescueStuckFunds("0xAccount");
221
228
  ```
222
229
 
223
- `setRiskEngineWallet()` maps to the current contract behavior in which the same method is used by the protocol relayer and by the builder; on-chain access control decides which of `riskEngineWallet` or `builderRiskEngineWallet` is updated.
224
-
225
230
  ### `prop.factory`
226
231
 
227
232
  Canonical on-chain surface of the current factory:
@@ -321,12 +326,14 @@ The utility layer mirrors the current contract formulas.
321
326
  Decimals:
322
327
 
323
328
  ```ts
324
- toUsdc(100); // 100_000_000n
329
+ toUsdc(100); // 100_000_000n (6dec)
325
330
  fromUsdc(100_000_000n); // 100
326
- to8Dec(100_000_000n); // 10_000_000_000n
327
- toUsdc6(10_000_000_000n); // 100_000_000n
331
+ to8Dec(100_000_000n); // 10_000_000_000n (6dec→8dec, for spotSend)
332
+ toUsdc6(10_000_000_000n); // 100_000_000n (8dec→6dec)
328
333
  ```
329
334
 
335
+ Note: On-chain `highWaterMark`, `dayStartValue`, and drawdown floors are all 6dec (matching `accountMarginSummary` output). `spotBalance` and `spotSend` use 8dec.
336
+
330
337
  Activation fee:
331
338
 
332
339
  ```ts
@@ -180,6 +180,5 @@ describe("account reads", () => {
180
180
  return;
181
181
  const pw = await account.getPendingWithdrawal(existingAccount);
182
182
  expect(pw.profit).toBeTypeOf("bigint");
183
- expect(typeof pw.requestedAt).toBe("number");
184
183
  });
185
184
  });
@@ -7,6 +7,10 @@ export declare const factoryAbi: readonly [{
7
7
  readonly internalType: "address";
8
8
  readonly name: "_implementation";
9
9
  readonly type: "address";
10
+ }, {
11
+ readonly internalType: "address";
12
+ readonly name: "_forwarder";
13
+ readonly type: "address";
10
14
  }];
11
15
  readonly stateMutability: "nonpayable";
12
16
  readonly type: "constructor";
@@ -189,6 +193,16 @@ export declare const factoryAbi: readonly [{
189
193
  }];
190
194
  readonly stateMutability: "nonpayable";
191
195
  readonly type: "function";
196
+ }, {
197
+ readonly inputs: readonly [];
198
+ readonly name: "forwarder";
199
+ readonly outputs: readonly [{
200
+ readonly internalType: "address";
201
+ readonly name: "";
202
+ readonly type: "address";
203
+ }];
204
+ readonly stateMutability: "view";
205
+ readonly type: "function";
192
206
  }, {
193
207
  readonly inputs: readonly [];
194
208
  readonly name: "implementation";
@@ -10,6 +10,11 @@ export const factoryAbi = [
10
10
  "internalType": "address",
11
11
  "name": "_implementation",
12
12
  "type": "address"
13
+ },
14
+ {
15
+ "internalType": "address",
16
+ "name": "_forwarder",
17
+ "type": "address"
13
18
  }
14
19
  ],
15
20
  "stateMutability": "nonpayable",
@@ -244,6 +249,19 @@ export const factoryAbi = [
244
249
  "stateMutability": "nonpayable",
245
250
  "type": "function"
246
251
  },
252
+ {
253
+ "inputs": [],
254
+ "name": "forwarder",
255
+ "outputs": [
256
+ {
257
+ "internalType": "address",
258
+ "name": "",
259
+ "type": "address"
260
+ }
261
+ ],
262
+ "stateMutability": "view",
263
+ "type": "function"
264
+ },
247
265
  {
248
266
  "inputs": [],
249
267
  "name": "implementation",
@@ -0,0 +1,287 @@
1
+ export declare const forwarderAbi: readonly [{
2
+ readonly inputs: readonly [];
3
+ readonly stateMutability: "nonpayable";
4
+ readonly type: "constructor";
5
+ }, {
6
+ readonly inputs: readonly [{
7
+ readonly internalType: "uint48";
8
+ readonly name: "deadline";
9
+ readonly type: "uint48";
10
+ }];
11
+ readonly name: "ERC2771ForwarderExpiredRequest";
12
+ readonly type: "error";
13
+ }, {
14
+ readonly inputs: readonly [{
15
+ readonly internalType: "address";
16
+ readonly name: "signer";
17
+ readonly type: "address";
18
+ }, {
19
+ readonly internalType: "address";
20
+ readonly name: "from";
21
+ readonly type: "address";
22
+ }];
23
+ readonly name: "ERC2771ForwarderInvalidSigner";
24
+ readonly type: "error";
25
+ }, {
26
+ readonly inputs: readonly [{
27
+ readonly internalType: "uint256";
28
+ readonly name: "requestedValue";
29
+ readonly type: "uint256";
30
+ }, {
31
+ readonly internalType: "uint256";
32
+ readonly name: "msgValue";
33
+ readonly type: "uint256";
34
+ }];
35
+ readonly name: "ERC2771ForwarderMismatchedValue";
36
+ readonly type: "error";
37
+ }, {
38
+ readonly inputs: readonly [{
39
+ readonly internalType: "address";
40
+ readonly name: "target";
41
+ readonly type: "address";
42
+ }, {
43
+ readonly internalType: "address";
44
+ readonly name: "forwarder";
45
+ readonly type: "address";
46
+ }];
47
+ readonly name: "ERC2771UntrustfulTarget";
48
+ readonly type: "error";
49
+ }, {
50
+ readonly inputs: readonly [];
51
+ readonly name: "FailedCall";
52
+ readonly type: "error";
53
+ }, {
54
+ readonly inputs: readonly [{
55
+ readonly internalType: "uint256";
56
+ readonly name: "balance";
57
+ readonly type: "uint256";
58
+ }, {
59
+ readonly internalType: "uint256";
60
+ readonly name: "needed";
61
+ readonly type: "uint256";
62
+ }];
63
+ readonly name: "InsufficientBalance";
64
+ readonly type: "error";
65
+ }, {
66
+ readonly inputs: readonly [{
67
+ readonly internalType: "address";
68
+ readonly name: "account";
69
+ readonly type: "address";
70
+ }, {
71
+ readonly internalType: "uint256";
72
+ readonly name: "currentNonce";
73
+ readonly type: "uint256";
74
+ }];
75
+ readonly name: "InvalidAccountNonce";
76
+ readonly type: "error";
77
+ }, {
78
+ readonly inputs: readonly [];
79
+ readonly name: "InvalidShortString";
80
+ readonly type: "error";
81
+ }, {
82
+ readonly inputs: readonly [{
83
+ readonly internalType: "string";
84
+ readonly name: "str";
85
+ readonly type: "string";
86
+ }];
87
+ readonly name: "StringTooLong";
88
+ readonly type: "error";
89
+ }, {
90
+ readonly anonymous: false;
91
+ readonly inputs: readonly [];
92
+ readonly name: "EIP712DomainChanged";
93
+ readonly type: "event";
94
+ }, {
95
+ readonly anonymous: false;
96
+ readonly inputs: readonly [{
97
+ readonly indexed: true;
98
+ readonly internalType: "address";
99
+ readonly name: "signer";
100
+ readonly type: "address";
101
+ }, {
102
+ readonly indexed: false;
103
+ readonly internalType: "uint256";
104
+ readonly name: "nonce";
105
+ readonly type: "uint256";
106
+ }, {
107
+ readonly indexed: false;
108
+ readonly internalType: "bool";
109
+ readonly name: "success";
110
+ readonly type: "bool";
111
+ }];
112
+ readonly name: "ExecutedForwardRequest";
113
+ readonly type: "event";
114
+ }, {
115
+ readonly inputs: readonly [];
116
+ readonly name: "eip712Domain";
117
+ readonly outputs: readonly [{
118
+ readonly internalType: "bytes1";
119
+ readonly name: "fields";
120
+ readonly type: "bytes1";
121
+ }, {
122
+ readonly internalType: "string";
123
+ readonly name: "name";
124
+ readonly type: "string";
125
+ }, {
126
+ readonly internalType: "string";
127
+ readonly name: "version";
128
+ readonly type: "string";
129
+ }, {
130
+ readonly internalType: "uint256";
131
+ readonly name: "chainId";
132
+ readonly type: "uint256";
133
+ }, {
134
+ readonly internalType: "address";
135
+ readonly name: "verifyingContract";
136
+ readonly type: "address";
137
+ }, {
138
+ readonly internalType: "bytes32";
139
+ readonly name: "salt";
140
+ readonly type: "bytes32";
141
+ }, {
142
+ readonly internalType: "uint256[]";
143
+ readonly name: "extensions";
144
+ readonly type: "uint256[]";
145
+ }];
146
+ readonly stateMutability: "view";
147
+ readonly type: "function";
148
+ }, {
149
+ readonly inputs: readonly [{
150
+ readonly components: readonly [{
151
+ readonly internalType: "address";
152
+ readonly name: "from";
153
+ readonly type: "address";
154
+ }, {
155
+ readonly internalType: "address";
156
+ readonly name: "to";
157
+ readonly type: "address";
158
+ }, {
159
+ readonly internalType: "uint256";
160
+ readonly name: "value";
161
+ readonly type: "uint256";
162
+ }, {
163
+ readonly internalType: "uint256";
164
+ readonly name: "gas";
165
+ readonly type: "uint256";
166
+ }, {
167
+ readonly internalType: "uint48";
168
+ readonly name: "deadline";
169
+ readonly type: "uint48";
170
+ }, {
171
+ readonly internalType: "bytes";
172
+ readonly name: "data";
173
+ readonly type: "bytes";
174
+ }, {
175
+ readonly internalType: "bytes";
176
+ readonly name: "signature";
177
+ readonly type: "bytes";
178
+ }];
179
+ readonly internalType: "struct ERC2771Forwarder.ForwardRequestData";
180
+ readonly name: "request";
181
+ readonly type: "tuple";
182
+ }];
183
+ readonly name: "execute";
184
+ readonly outputs: readonly [];
185
+ readonly stateMutability: "payable";
186
+ readonly type: "function";
187
+ }, {
188
+ readonly inputs: readonly [{
189
+ readonly components: readonly [{
190
+ readonly internalType: "address";
191
+ readonly name: "from";
192
+ readonly type: "address";
193
+ }, {
194
+ readonly internalType: "address";
195
+ readonly name: "to";
196
+ readonly type: "address";
197
+ }, {
198
+ readonly internalType: "uint256";
199
+ readonly name: "value";
200
+ readonly type: "uint256";
201
+ }, {
202
+ readonly internalType: "uint256";
203
+ readonly name: "gas";
204
+ readonly type: "uint256";
205
+ }, {
206
+ readonly internalType: "uint48";
207
+ readonly name: "deadline";
208
+ readonly type: "uint48";
209
+ }, {
210
+ readonly internalType: "bytes";
211
+ readonly name: "data";
212
+ readonly type: "bytes";
213
+ }, {
214
+ readonly internalType: "bytes";
215
+ readonly name: "signature";
216
+ readonly type: "bytes";
217
+ }];
218
+ readonly internalType: "struct ERC2771Forwarder.ForwardRequestData[]";
219
+ readonly name: "requests";
220
+ readonly type: "tuple[]";
221
+ }, {
222
+ readonly internalType: "address payable";
223
+ readonly name: "refundReceiver";
224
+ readonly type: "address";
225
+ }];
226
+ readonly name: "executeBatch";
227
+ readonly outputs: readonly [];
228
+ readonly stateMutability: "payable";
229
+ readonly type: "function";
230
+ }, {
231
+ readonly inputs: readonly [{
232
+ readonly internalType: "address";
233
+ readonly name: "owner";
234
+ readonly type: "address";
235
+ }];
236
+ readonly name: "nonces";
237
+ readonly outputs: readonly [{
238
+ readonly internalType: "uint256";
239
+ readonly name: "";
240
+ readonly type: "uint256";
241
+ }];
242
+ readonly stateMutability: "view";
243
+ readonly type: "function";
244
+ }, {
245
+ readonly inputs: readonly [{
246
+ readonly components: readonly [{
247
+ readonly internalType: "address";
248
+ readonly name: "from";
249
+ readonly type: "address";
250
+ }, {
251
+ readonly internalType: "address";
252
+ readonly name: "to";
253
+ readonly type: "address";
254
+ }, {
255
+ readonly internalType: "uint256";
256
+ readonly name: "value";
257
+ readonly type: "uint256";
258
+ }, {
259
+ readonly internalType: "uint256";
260
+ readonly name: "gas";
261
+ readonly type: "uint256";
262
+ }, {
263
+ readonly internalType: "uint48";
264
+ readonly name: "deadline";
265
+ readonly type: "uint48";
266
+ }, {
267
+ readonly internalType: "bytes";
268
+ readonly name: "data";
269
+ readonly type: "bytes";
270
+ }, {
271
+ readonly internalType: "bytes";
272
+ readonly name: "signature";
273
+ readonly type: "bytes";
274
+ }];
275
+ readonly internalType: "struct ERC2771Forwarder.ForwardRequestData";
276
+ readonly name: "request";
277
+ readonly type: "tuple";
278
+ }];
279
+ readonly name: "verify";
280
+ readonly outputs: readonly [{
281
+ readonly internalType: "bool";
282
+ readonly name: "";
283
+ readonly type: "bool";
284
+ }];
285
+ readonly stateMutability: "view";
286
+ readonly type: "function";
287
+ }];