@glowlabs-org/utils 0.2.167 → 0.2.169
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/dist/cjs/browser.js +71 -1
- package/dist/cjs/browser.js.map +1 -1
- package/dist/cjs/{calculate-farm-efficiency-DabpqtXj.js → calculate-farm-efficiency-BVpffn8k.js} +105 -1
- package/dist/cjs/calculate-farm-efficiency-BVpffn8k.js.map +1 -0
- package/dist/cjs/constants/addresses.d.ts +2 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/lib/control-api/control-router.d.ts +34 -0
- package/dist/cjs/utils/stake-control.d.ts +38 -0
- package/dist/esm/browser.js +67 -3
- package/dist/esm/browser.js.map +1 -1
- package/dist/esm/{calculate-farm-efficiency-HjxTADsE.js → calculate-farm-efficiency-Cq10L_Uq.js} +104 -2
- package/dist/esm/calculate-farm-efficiency-Cq10L_Uq.js.map +1 -0
- package/dist/esm/constants/addresses.d.ts +2 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/lib/control-api/control-router.d.ts +34 -0
- package/dist/esm/utils/stake-control.d.ts +38 -0
- package/package.json +1 -1
- package/src/constants/addresses.ts +5 -0
- package/src/lib/control-api/control-router.ts +147 -0
- package/src/utils/stake-control.ts +86 -0
- package/dist/cjs/calculate-farm-efficiency-DabpqtXj.js.map +0 -1
- package/dist/esm/calculate-farm-efficiency-HjxTADsE.js.map +0 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export type ContractKeys = "USDC" | "FORWARDER" | "FOUNDATION_WALLET" | "GLW" | "USDG" | "USDG_REDEMPTION" | "IMPACT_CATALYST" | "AUDIT_FEE_WALLET" | "UNISWAP_V2_ROUTER" | "UNISWAP_V2_FACTORY" | "USDG_UNISWAP" | "GLW_UNISWAP" | "OFFCHAIN_FRACTIONS" | "COUNTERFACTUAL_HOLDER_FACTORY" | "FOUNDATION_HUB_MANAGER_WALLET" | "FOUNDATION_REWARDS_WALLET" | "ENDOWMENT_WALLET" | "REWARDS_KERNEL" | "FOUNDATION_HOT_WALLET_PD";
|
|
2
2
|
export declare const getAddresses: (CHAIN_ID: number) => Record<ContractKeys, `0x${string}`>;
|
|
3
3
|
export declare const DECIMALS_BY_TOKEN: Record<"USDC" | "USDG" | "GCTL" | "SGCTL" | "GLW", number>;
|
|
4
|
+
export declare const SGCTL_OFFCHAIN_TOKEN_ADDRESS = "0xSGCTL0000000000000000000000000000000000";
|
|
5
|
+
export declare const GCTL_OFFCHAIN_TOKEN_ADDRESS = "0xGCTL0000000000000000000000000000000000";
|
package/dist/esm/index.js
CHANGED
|
@@ -13,8 +13,8 @@ import { parseUnits, formatUnits } from 'viem';
|
|
|
13
13
|
import { MerkleTree } from 'merkletreejs';
|
|
14
14
|
import { solidityPackedKeccak256, keccak256 } from 'ethers';
|
|
15
15
|
import Decimal from 'decimal.js';
|
|
16
|
-
import { H as HUB_URL, U as USDG_WEIGHT_DECIMAL_PRECISION, G as GLOW_WEIGHT_DECIMAL_PRECISION, M as MAX_WEIGHT } from './calculate-farm-efficiency-
|
|
17
|
-
export { C as ControlRouter, F as FarmsRouter, e as KICKSTARTER_STATUS, K as KickstarterRouter, O as OFF_CHAIN_PAYMENT_CURRENCIES, P as PAYMENT_CURRENCIES, d as REGIONS, R as RegionRouter, S as STAKING_DIRECTIONS, T as TRANSFER_TYPES, W as WalletsRouter, f as calculateFarmEfficiency, c as configureSentry, u as useForwarder, a as useOffchainFractions, b as useRewardsKernel } from './calculate-farm-efficiency-
|
|
16
|
+
import { H as HUB_URL, U as USDG_WEIGHT_DECIMAL_PRECISION, G as GLOW_WEIGHT_DECIMAL_PRECISION, M as MAX_WEIGHT } from './calculate-farm-efficiency-Cq10L_Uq.js';
|
|
17
|
+
export { C as ControlRouter, F as FarmsRouter, e as KICKSTARTER_STATUS, K as KickstarterRouter, O as OFF_CHAIN_PAYMENT_CURRENCIES, P as PAYMENT_CURRENCIES, d as REGIONS, R as RegionRouter, S as STAKING_DIRECTIONS, T as TRANSFER_TYPES, W as WalletsRouter, f as calculateFarmEfficiency, c as configureSentry, u as useForwarder, a as useOffchainFractions, b as useRewardsKernel } from './calculate-farm-efficiency-Cq10L_Uq.js';
|
|
18
18
|
|
|
19
19
|
const GENESIS_TIMESTAMP = 1700352000;
|
|
20
20
|
|
|
@@ -22,6 +22,36 @@ export interface MigrateUserRequest {
|
|
|
22
22
|
export interface MigrateUserResponse {
|
|
23
23
|
success: true;
|
|
24
24
|
}
|
|
25
|
+
export interface DelegateSgctlRequest {
|
|
26
|
+
wallet: string;
|
|
27
|
+
applicationId: string;
|
|
28
|
+
fractionId: string;
|
|
29
|
+
amount: string;
|
|
30
|
+
signature: string;
|
|
31
|
+
deadline: string;
|
|
32
|
+
nonce: string;
|
|
33
|
+
}
|
|
34
|
+
export interface DelegateSgctlResponse {
|
|
35
|
+
success: true;
|
|
36
|
+
delegationId: string;
|
|
37
|
+
}
|
|
38
|
+
export interface RefundDelegationRequest {
|
|
39
|
+
fractionId: string;
|
|
40
|
+
}
|
|
41
|
+
export interface RefundDelegationResponse {
|
|
42
|
+
success: true;
|
|
43
|
+
fractionId: string;
|
|
44
|
+
processed: number;
|
|
45
|
+
}
|
|
46
|
+
export interface FinalizeDelegationRequest {
|
|
47
|
+
fractionId: string;
|
|
48
|
+
farmId: string;
|
|
49
|
+
}
|
|
50
|
+
export interface FinalizeDelegationResponse {
|
|
51
|
+
success: true;
|
|
52
|
+
fractionId: string;
|
|
53
|
+
processed: number;
|
|
54
|
+
}
|
|
25
55
|
export declare function ControlRouter(baseUrl: string): {
|
|
26
56
|
readonly fetchGctlBalance: (wallet: string) => Promise<string>;
|
|
27
57
|
readonly fetchCommittedBalance: (wallet: string) => Promise<string>;
|
|
@@ -48,10 +78,14 @@ export declare function ControlRouter(baseUrl: string): {
|
|
|
48
78
|
readonly retryFailedOperation: (operationId: string) => Promise<RetryFailedOperationResponse>;
|
|
49
79
|
readonly payProtocolDepositUsingStakedControl: (paymentRequest: PayProtocolDepositUsingStakedControlRequest) => Promise<PayProtocolDepositUsingStakedControlResponse>;
|
|
50
80
|
readonly migrateUser: (migrateRequest: MigrateUserRequest) => Promise<MigrateUserResponse>;
|
|
81
|
+
readonly delegateSgctl: (delegationRequest: DelegateSgctlRequest) => Promise<DelegateSgctlResponse>;
|
|
82
|
+
readonly refundDelegation: (refundRequest: RefundDelegationRequest) => Promise<RefundDelegationResponse>;
|
|
83
|
+
readonly finalizeDelegation: (finalizeRequest: FinalizeDelegationRequest) => Promise<FinalizeDelegationResponse>;
|
|
51
84
|
readonly isStaking: boolean;
|
|
52
85
|
readonly isUnstaking: boolean;
|
|
53
86
|
readonly isRestaking: boolean;
|
|
54
87
|
readonly isRetryingFailedOperation: boolean;
|
|
55
88
|
readonly isPayingProtocolDepositUsingStakedControl: boolean;
|
|
56
89
|
readonly isMigratingUser: boolean;
|
|
90
|
+
readonly isDelegatingSgctl: boolean;
|
|
57
91
|
};
|
|
@@ -122,6 +122,24 @@ export declare const verifyUserEIP712Types: {
|
|
|
122
122
|
readonly type: "uint256";
|
|
123
123
|
}];
|
|
124
124
|
};
|
|
125
|
+
export declare const delegateSgctlEIP712Types: {
|
|
126
|
+
readonly DelegateSgctl: readonly [{
|
|
127
|
+
readonly name: "nonce";
|
|
128
|
+
readonly type: "uint256";
|
|
129
|
+
}, {
|
|
130
|
+
readonly name: "amount";
|
|
131
|
+
readonly type: "uint256";
|
|
132
|
+
}, {
|
|
133
|
+
readonly name: "applicationId";
|
|
134
|
+
readonly type: "string";
|
|
135
|
+
}, {
|
|
136
|
+
readonly name: "fractionId";
|
|
137
|
+
readonly type: "string";
|
|
138
|
+
}, {
|
|
139
|
+
readonly name: "deadline";
|
|
140
|
+
readonly type: "uint256";
|
|
141
|
+
}];
|
|
142
|
+
};
|
|
125
143
|
export declare const stakeSignatureRequestSchema: z.ZodObject<{
|
|
126
144
|
wallet: z.ZodString;
|
|
127
145
|
signature: z.ZodString;
|
|
@@ -185,6 +203,15 @@ export declare const verifyUserSignatureRequestSchema: z.ZodObject<{
|
|
|
185
203
|
nonce: z.ZodString;
|
|
186
204
|
deadline: z.ZodString;
|
|
187
205
|
}, z.core.$strip>;
|
|
206
|
+
export declare const delegateSgctlSignatureRequestSchema: z.ZodObject<{
|
|
207
|
+
wallet: z.ZodString;
|
|
208
|
+
signature: z.ZodString;
|
|
209
|
+
nonce: z.ZodString;
|
|
210
|
+
amount: z.ZodString;
|
|
211
|
+
applicationId: z.ZodString;
|
|
212
|
+
fractionId: z.ZodString;
|
|
213
|
+
deadline: z.ZodString;
|
|
214
|
+
}, z.core.$strip>;
|
|
188
215
|
export type StakeSignatureRequest = z.infer<typeof stakeSignatureRequestSchema>;
|
|
189
216
|
export type UnstakeUnlockSignatureRequest = z.infer<typeof unstakeUnlockSignatureRequestSchema>;
|
|
190
217
|
export type UnstakeMoveSignatureRequest = z.infer<typeof unstakeMoveSignatureRequestSchema>;
|
|
@@ -193,6 +220,7 @@ export type CommitKickstarterSignatureRequest = z.infer<typeof commitKickstarter
|
|
|
193
220
|
export type ApplyCertifiedInstallerSignatureRequest = z.infer<typeof applyCertifiedInstallerSignatureRequestSchema>;
|
|
194
221
|
export type PayProtocolDepositUsingStakedControlSignatureRequest = z.infer<typeof payProtocolDepositUsingStakedControlSignatureRequestSchema>;
|
|
195
222
|
export type VerifyUserSignatureRequest = z.infer<typeof verifyUserSignatureRequestSchema>;
|
|
223
|
+
export type DelegateSgctlSignatureRequest = z.infer<typeof delegateSgctlSignatureRequestSchema>;
|
|
196
224
|
export type StakeMessage = {
|
|
197
225
|
nonce: bigint;
|
|
198
226
|
amount: bigint;
|
|
@@ -247,6 +275,13 @@ export type VerifyUserMessage = {
|
|
|
247
275
|
nonce: bigint;
|
|
248
276
|
deadline: bigint;
|
|
249
277
|
};
|
|
278
|
+
export type DelegateSgctlMessage = {
|
|
279
|
+
nonce: bigint;
|
|
280
|
+
amount: bigint;
|
|
281
|
+
applicationId: string;
|
|
282
|
+
fractionId: string;
|
|
283
|
+
deadline: bigint;
|
|
284
|
+
};
|
|
250
285
|
export type SignatureValidationReason = "deadline_expired" | "signature_failed" | "signer_mismatch" | null;
|
|
251
286
|
export type SignatureValidationResult = {
|
|
252
287
|
valid: boolean;
|
|
@@ -261,6 +296,7 @@ type CommitKickstarterMessageInput = Pick<CommitKickstarterSignatureRequest, "no
|
|
|
261
296
|
type ApplyCertifiedInstallerMessageInput = Pick<ApplyCertifiedInstallerSignatureRequest, "nonce" | "regionId" | "deadline">;
|
|
262
297
|
type PayProtocolDepositUsingStakedControlMessageInput = Pick<PayProtocolDepositUsingStakedControlSignatureRequest, "amount" | "applicationId" | "nonce" | "deadline">;
|
|
263
298
|
type VerifyUserMessageInput = Pick<VerifyUserSignatureRequest, "nonce" | "deadline">;
|
|
299
|
+
type DelegateSgctlMessageInput = Pick<DelegateSgctlSignatureRequest, "nonce" | "amount" | "applicationId" | "fractionId" | "deadline">;
|
|
264
300
|
export declare function buildStakeMessage(req: StakeMessageInput): StakeMessage;
|
|
265
301
|
export declare function buildUnstakeUnlockMessage(req: UnstakeUnlockMessageInput): UnstakeUnlockMessage;
|
|
266
302
|
export declare function buildUnstakeMoveMessage(req: UnstakeMoveMessageInput): UnstakeMoveMessage;
|
|
@@ -269,6 +305,7 @@ export declare function buildCommitKickstarterMessage(req: CommitKickstarterMess
|
|
|
269
305
|
export declare function buildApplyCertifiedInstallerMessage(req: ApplyCertifiedInstallerMessageInput): ApplyCertifiedInstallerMessage;
|
|
270
306
|
export declare function buildPayProtocolDepositUsingStakedControlMessage(req: PayProtocolDepositUsingStakedControlMessageInput): PayProtocolDepositUsingStakedControlMessage;
|
|
271
307
|
export declare function buildVerifyUserMessage(req: VerifyUserMessageInput): VerifyUserMessage;
|
|
308
|
+
export declare function buildDelegateSgctlMessage(req: DelegateSgctlMessageInput): DelegateSgctlMessage;
|
|
272
309
|
export declare function validateStakeSignature(input: StakeSignatureRequest, domain?: ReturnType<typeof stakeControlEIP712Domain>): Promise<SignatureValidationResult>;
|
|
273
310
|
export declare function validateUnstakeUnlockSignature(input: UnstakeUnlockSignatureRequest, domain?: ReturnType<typeof stakeControlEIP712Domain>): Promise<SignatureValidationResult>;
|
|
274
311
|
export declare function validateUnstakeMoveSignature(input: UnstakeMoveSignatureRequest, domain?: ReturnType<typeof stakeControlEIP712Domain>): Promise<SignatureValidationResult>;
|
|
@@ -277,4 +314,5 @@ export declare function validateCommitKickstarterSignature(input: CommitKickstar
|
|
|
277
314
|
export declare function validateApplyCertifiedInstallerSignature(input: ApplyCertifiedInstallerSignatureRequest, domain?: ReturnType<typeof stakeControlEIP712Domain>): Promise<SignatureValidationResult>;
|
|
278
315
|
export declare function validatePayProtocolDepositUsingStakedControlSignature(input: PayProtocolDepositUsingStakedControlSignatureRequest, domain?: ReturnType<typeof stakeControlEIP712Domain>): Promise<SignatureValidationResult>;
|
|
279
316
|
export declare function validateVerifyUserSignature(input: VerifyUserSignatureRequest, domain?: ReturnType<typeof stakeControlEIP712Domain>): Promise<SignatureValidationResult>;
|
|
317
|
+
export declare function validateDelegateSgctlSignature(input: DelegateSgctlSignatureRequest, domain?: ReturnType<typeof stakeControlEIP712Domain>): Promise<SignatureValidationResult>;
|
|
280
318
|
export {};
|
package/package.json
CHANGED
|
@@ -65,6 +65,42 @@ export interface MigrateUserResponse {
|
|
|
65
65
|
success: true;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
export interface DelegateSgctlRequest {
|
|
69
|
+
wallet: string;
|
|
70
|
+
applicationId: string;
|
|
71
|
+
fractionId: string;
|
|
72
|
+
amount: string;
|
|
73
|
+
signature: string;
|
|
74
|
+
deadline: string;
|
|
75
|
+
nonce: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface DelegateSgctlResponse {
|
|
79
|
+
success: true;
|
|
80
|
+
delegationId: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface RefundDelegationRequest {
|
|
84
|
+
fractionId: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface RefundDelegationResponse {
|
|
88
|
+
success: true;
|
|
89
|
+
fractionId: string;
|
|
90
|
+
processed: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface FinalizeDelegationRequest {
|
|
94
|
+
fractionId: string;
|
|
95
|
+
farmId: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface FinalizeDelegationResponse {
|
|
99
|
+
success: true;
|
|
100
|
+
fractionId: string;
|
|
101
|
+
processed: number;
|
|
102
|
+
}
|
|
103
|
+
|
|
68
104
|
// --------------------------------------------------------------------------
|
|
69
105
|
|
|
70
106
|
/**
|
|
@@ -328,6 +364,7 @@ export function ControlRouter(baseUrl: string) {
|
|
|
328
364
|
let isRetryingFailedOperation = false;
|
|
329
365
|
let isPayingProtocolDepositUsingStakedControl = false;
|
|
330
366
|
let isMigratingUser = false;
|
|
367
|
+
let isDelegatingSgctl = false;
|
|
331
368
|
|
|
332
369
|
const stakeGctl = async (stakeRequest: StakeRequest): Promise<boolean> => {
|
|
333
370
|
isStaking = true;
|
|
@@ -555,6 +592,110 @@ export function ControlRouter(baseUrl: string) {
|
|
|
555
592
|
}
|
|
556
593
|
};
|
|
557
594
|
|
|
595
|
+
const delegateSgctl = async (
|
|
596
|
+
delegationRequest: DelegateSgctlRequest
|
|
597
|
+
): Promise<DelegateSgctlResponse> => {
|
|
598
|
+
isDelegatingSgctl = true;
|
|
599
|
+
try {
|
|
600
|
+
sentryAddBreadcrumb({
|
|
601
|
+
category: "control-api",
|
|
602
|
+
message: "POST /delegate-sgctl",
|
|
603
|
+
level: "info",
|
|
604
|
+
data: {
|
|
605
|
+
baseUrl,
|
|
606
|
+
wallet: delegationRequest.wallet,
|
|
607
|
+
applicationId: delegationRequest.applicationId,
|
|
608
|
+
fractionId: delegationRequest.fractionId,
|
|
609
|
+
amount: delegationRequest.amount,
|
|
610
|
+
},
|
|
611
|
+
});
|
|
612
|
+
const response = await request<DelegateSgctlResponse>(`/delegate-sgctl`, {
|
|
613
|
+
method: "POST",
|
|
614
|
+
headers: { "Content-Type": "application/json" },
|
|
615
|
+
body: JSON.stringify(delegationRequest),
|
|
616
|
+
});
|
|
617
|
+
return response;
|
|
618
|
+
} catch (error) {
|
|
619
|
+
sentryCaptureException(error, {
|
|
620
|
+
action: "delegateSgctl",
|
|
621
|
+
baseUrl,
|
|
622
|
+
wallet: delegationRequest.wallet,
|
|
623
|
+
applicationId: delegationRequest.applicationId,
|
|
624
|
+
fractionId: delegationRequest.fractionId,
|
|
625
|
+
amount: delegationRequest.amount,
|
|
626
|
+
});
|
|
627
|
+
throw new Error(parseApiError(error));
|
|
628
|
+
} finally {
|
|
629
|
+
isDelegatingSgctl = false;
|
|
630
|
+
}
|
|
631
|
+
};
|
|
632
|
+
|
|
633
|
+
const refundDelegation = async (
|
|
634
|
+
refundRequest: RefundDelegationRequest
|
|
635
|
+
): Promise<RefundDelegationResponse> => {
|
|
636
|
+
try {
|
|
637
|
+
sentryAddBreadcrumb({
|
|
638
|
+
category: "control-api",
|
|
639
|
+
message: "POST /delegate-sgctl/refund",
|
|
640
|
+
level: "info",
|
|
641
|
+
data: {
|
|
642
|
+
baseUrl,
|
|
643
|
+
fractionId: refundRequest.fractionId,
|
|
644
|
+
},
|
|
645
|
+
});
|
|
646
|
+
const response = await request<RefundDelegationResponse>(
|
|
647
|
+
`/delegate-sgctl/refund`,
|
|
648
|
+
{
|
|
649
|
+
method: "POST",
|
|
650
|
+
headers: { "Content-Type": "application/json" },
|
|
651
|
+
body: JSON.stringify(refundRequest),
|
|
652
|
+
}
|
|
653
|
+
);
|
|
654
|
+
return response;
|
|
655
|
+
} catch (error) {
|
|
656
|
+
sentryCaptureException(error, {
|
|
657
|
+
action: "refundDelegation",
|
|
658
|
+
baseUrl,
|
|
659
|
+
fractionId: refundRequest.fractionId,
|
|
660
|
+
});
|
|
661
|
+
throw new Error(parseApiError(error));
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
const finalizeDelegation = async (
|
|
666
|
+
finalizeRequest: FinalizeDelegationRequest
|
|
667
|
+
): Promise<FinalizeDelegationResponse> => {
|
|
668
|
+
try {
|
|
669
|
+
sentryAddBreadcrumb({
|
|
670
|
+
category: "control-api",
|
|
671
|
+
message: "POST /delegate-sgctl/finalize",
|
|
672
|
+
level: "info",
|
|
673
|
+
data: {
|
|
674
|
+
baseUrl,
|
|
675
|
+
fractionId: finalizeRequest.fractionId,
|
|
676
|
+
farmId: finalizeRequest.farmId,
|
|
677
|
+
},
|
|
678
|
+
});
|
|
679
|
+
const response = await request<FinalizeDelegationResponse>(
|
|
680
|
+
`/delegate-sgctl/finalize`,
|
|
681
|
+
{
|
|
682
|
+
method: "POST",
|
|
683
|
+
headers: { "Content-Type": "application/json" },
|
|
684
|
+
body: JSON.stringify(finalizeRequest),
|
|
685
|
+
}
|
|
686
|
+
);
|
|
687
|
+
return response;
|
|
688
|
+
} catch (error) {
|
|
689
|
+
sentryCaptureException(error, {
|
|
690
|
+
action: "finalizeDelegation",
|
|
691
|
+
baseUrl,
|
|
692
|
+
fractionId: finalizeRequest.fractionId,
|
|
693
|
+
farmId: finalizeRequest.farmId,
|
|
694
|
+
});
|
|
695
|
+
throw new Error(parseApiError(error));
|
|
696
|
+
}
|
|
697
|
+
};
|
|
698
|
+
|
|
558
699
|
// --------------------------- Public API ----------------------------------
|
|
559
700
|
return {
|
|
560
701
|
// Queries
|
|
@@ -585,6 +726,9 @@ export function ControlRouter(baseUrl: string) {
|
|
|
585
726
|
retryFailedOperation,
|
|
586
727
|
payProtocolDepositUsingStakedControl,
|
|
587
728
|
migrateUser,
|
|
729
|
+
delegateSgctl,
|
|
730
|
+
refundDelegation,
|
|
731
|
+
finalizeDelegation,
|
|
588
732
|
|
|
589
733
|
// Processing flags
|
|
590
734
|
get isStaking() {
|
|
@@ -605,5 +749,8 @@ export function ControlRouter(baseUrl: string) {
|
|
|
605
749
|
get isMigratingUser() {
|
|
606
750
|
return isMigratingUser;
|
|
607
751
|
},
|
|
752
|
+
get isDelegatingSgctl() {
|
|
753
|
+
return isDelegatingSgctl;
|
|
754
|
+
},
|
|
608
755
|
} as const;
|
|
609
756
|
}
|
|
@@ -82,6 +82,16 @@ export const verifyUserEIP712Types = {
|
|
|
82
82
|
],
|
|
83
83
|
} as const;
|
|
84
84
|
|
|
85
|
+
export const delegateSgctlEIP712Types = {
|
|
86
|
+
DelegateSgctl: [
|
|
87
|
+
{ name: "nonce", type: "uint256" },
|
|
88
|
+
{ name: "amount", type: "uint256" },
|
|
89
|
+
{ name: "applicationId", type: "string" },
|
|
90
|
+
{ name: "fractionId", type: "string" },
|
|
91
|
+
{ name: "deadline", type: "uint256" },
|
|
92
|
+
],
|
|
93
|
+
} as const;
|
|
94
|
+
|
|
85
95
|
// Separate request schemas for clarity between stake and unstake
|
|
86
96
|
export const stakeSignatureRequestSchema = z.object({
|
|
87
97
|
wallet: z.string().regex(/^0x[a-fA-F0-9]{40}$/),
|
|
@@ -155,6 +165,16 @@ export const verifyUserSignatureRequestSchema = z.object({
|
|
|
155
165
|
deadline: z.string(),
|
|
156
166
|
});
|
|
157
167
|
|
|
168
|
+
export const delegateSgctlSignatureRequestSchema = z.object({
|
|
169
|
+
wallet: z.string().regex(/^0x[a-fA-F0-9]{40}$/),
|
|
170
|
+
signature: z.string().regex(/^0x[a-fA-F0-9]{130}$/),
|
|
171
|
+
nonce: z.string(),
|
|
172
|
+
amount: z.string(),
|
|
173
|
+
applicationId: z.string(),
|
|
174
|
+
fractionId: z.string(),
|
|
175
|
+
deadline: z.string(),
|
|
176
|
+
});
|
|
177
|
+
|
|
158
178
|
export type StakeSignatureRequest = z.infer<typeof stakeSignatureRequestSchema>;
|
|
159
179
|
export type UnstakeUnlockSignatureRequest = z.infer<
|
|
160
180
|
typeof unstakeUnlockSignatureRequestSchema
|
|
@@ -179,6 +199,10 @@ export type VerifyUserSignatureRequest = z.infer<
|
|
|
179
199
|
typeof verifyUserSignatureRequestSchema
|
|
180
200
|
>;
|
|
181
201
|
|
|
202
|
+
export type DelegateSgctlSignatureRequest = z.infer<
|
|
203
|
+
typeof delegateSgctlSignatureRequestSchema
|
|
204
|
+
>;
|
|
205
|
+
|
|
182
206
|
export type StakeMessage = {
|
|
183
207
|
nonce: bigint;
|
|
184
208
|
amount: bigint;
|
|
@@ -242,6 +266,14 @@ export type VerifyUserMessage = {
|
|
|
242
266
|
deadline: bigint;
|
|
243
267
|
};
|
|
244
268
|
|
|
269
|
+
export type DelegateSgctlMessage = {
|
|
270
|
+
nonce: bigint;
|
|
271
|
+
amount: bigint;
|
|
272
|
+
applicationId: string;
|
|
273
|
+
fractionId: string;
|
|
274
|
+
deadline: bigint;
|
|
275
|
+
};
|
|
276
|
+
|
|
245
277
|
export type SignatureValidationReason =
|
|
246
278
|
| "deadline_expired"
|
|
247
279
|
| "signature_failed"
|
|
@@ -297,6 +329,11 @@ type VerifyUserMessageInput = Pick<
|
|
|
297
329
|
"nonce" | "deadline"
|
|
298
330
|
>;
|
|
299
331
|
|
|
332
|
+
type DelegateSgctlMessageInput = Pick<
|
|
333
|
+
DelegateSgctlSignatureRequest,
|
|
334
|
+
"nonce" | "amount" | "applicationId" | "fractionId" | "deadline"
|
|
335
|
+
>;
|
|
336
|
+
|
|
300
337
|
export function buildStakeMessage(req: StakeMessageInput): StakeMessage {
|
|
301
338
|
const nonce = BigInt(req.nonce);
|
|
302
339
|
const amount = BigInt(req.amount);
|
|
@@ -403,6 +440,22 @@ export function buildVerifyUserMessage(
|
|
|
403
440
|
return { nonce, deadline };
|
|
404
441
|
}
|
|
405
442
|
|
|
443
|
+
export function buildDelegateSgctlMessage(
|
|
444
|
+
req: DelegateSgctlMessageInput
|
|
445
|
+
): DelegateSgctlMessage {
|
|
446
|
+
const nonce = BigInt(req.nonce);
|
|
447
|
+
const amount = BigInt(req.amount);
|
|
448
|
+
const deadline = BigInt(req.deadline);
|
|
449
|
+
const applicationId = req.applicationId;
|
|
450
|
+
const fractionId = req.fractionId;
|
|
451
|
+
if (nonce < 0n) throw new Error("Nonce must be non-negative");
|
|
452
|
+
if (amount < 0n) throw new Error("Amount must be non-negative");
|
|
453
|
+
if (deadline < 0n) throw new Error("Deadline must be non-negative");
|
|
454
|
+
if (!applicationId) throw new Error("applicationId must be non-empty");
|
|
455
|
+
if (!fractionId) throw new Error("fractionId must be non-empty");
|
|
456
|
+
return { nonce, amount, applicationId, fractionId, deadline };
|
|
457
|
+
}
|
|
458
|
+
|
|
406
459
|
// Helper to validate the signature using viem
|
|
407
460
|
export async function validateStakeSignature(
|
|
408
461
|
input: StakeSignatureRequest,
|
|
@@ -658,3 +711,36 @@ export async function validateVerifyUserSignature(
|
|
|
658
711
|
return { valid: false, recovered: null, reason: "signature_failed" };
|
|
659
712
|
}
|
|
660
713
|
}
|
|
714
|
+
|
|
715
|
+
export async function validateDelegateSgctlSignature(
|
|
716
|
+
input: DelegateSgctlSignatureRequest,
|
|
717
|
+
domain: ReturnType<
|
|
718
|
+
typeof stakeControlEIP712Domain
|
|
719
|
+
> = stakeControlEIP712Domain(Number(process.env.CHAIN_ID) || 1)
|
|
720
|
+
): Promise<SignatureValidationResult> {
|
|
721
|
+
const message = buildDelegateSgctlMessage({
|
|
722
|
+
nonce: input.nonce,
|
|
723
|
+
amount: input.amount,
|
|
724
|
+
applicationId: input.applicationId,
|
|
725
|
+
fractionId: input.fractionId,
|
|
726
|
+
deadline: input.deadline,
|
|
727
|
+
});
|
|
728
|
+
if (isDeadlineExpired(message.deadline)) {
|
|
729
|
+
return { valid: false, recovered: null, reason: "deadline_expired" };
|
|
730
|
+
}
|
|
731
|
+
try {
|
|
732
|
+
const verified = await verifyTypedData({
|
|
733
|
+
address: checksumAddress(input.wallet as Hex),
|
|
734
|
+
domain,
|
|
735
|
+
types: delegateSgctlEIP712Types,
|
|
736
|
+
primaryType: "DelegateSgctl",
|
|
737
|
+
message,
|
|
738
|
+
signature: input.signature as Hex,
|
|
739
|
+
});
|
|
740
|
+
return verified
|
|
741
|
+
? { valid: true, recovered: input.wallet, reason: null }
|
|
742
|
+
: { valid: false, recovered: null, reason: "signer_mismatch" };
|
|
743
|
+
} catch (_) {
|
|
744
|
+
return { valid: false, recovered: null, reason: "signature_failed" };
|
|
745
|
+
}
|
|
746
|
+
}
|