@defisaver/ethena-sdk 0.0.5 → 0.0.6

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.
Files changed (53) hide show
  1. package/cjs/config/contracts.d.ts +181 -0
  2. package/cjs/config/contracts.js +72 -0
  3. package/cjs/constants/index.d.ts +3 -0
  4. package/cjs/constants/index.js +4 -1
  5. package/cjs/contracts.d.ts +696 -0
  6. package/cjs/contracts.js +80 -0
  7. package/cjs/execution/index.d.ts +2 -0
  8. package/cjs/execution/index.js +15 -0
  9. package/cjs/execution/morpho.d.ts +2 -0
  10. package/cjs/execution/morpho.js +56 -0
  11. package/cjs/index.d.ts +3 -1
  12. package/cjs/index.js +5 -1
  13. package/cjs/safe/index.d.ts +6 -0
  14. package/cjs/safe/index.js +80 -0
  15. package/cjs/services/viem.d.ts +31 -31
  16. package/cjs/types/execution.d.ts +9 -0
  17. package/cjs/types/execution.js +8 -0
  18. package/cjs/types/index.d.ts +2 -0
  19. package/cjs/types/index.js +2 -0
  20. package/cjs/types/safe.d.ts +5 -0
  21. package/cjs/types/safe.js +2 -0
  22. package/esm/config/contracts.d.ts +181 -0
  23. package/esm/config/contracts.js +69 -0
  24. package/esm/constants/index.d.ts +3 -0
  25. package/esm/constants/index.js +3 -0
  26. package/esm/contracts.d.ts +696 -0
  27. package/esm/contracts.js +37 -0
  28. package/esm/execution/index.d.ts +2 -0
  29. package/esm/execution/index.js +11 -0
  30. package/esm/execution/morpho.d.ts +2 -0
  31. package/esm/execution/morpho.js +52 -0
  32. package/esm/index.d.ts +3 -1
  33. package/esm/index.js +3 -1
  34. package/esm/safe/index.d.ts +6 -0
  35. package/esm/safe/index.js +75 -0
  36. package/esm/services/viem.d.ts +31 -31
  37. package/esm/types/execution.d.ts +9 -0
  38. package/esm/types/execution.js +5 -0
  39. package/esm/types/index.d.ts +2 -0
  40. package/esm/types/index.js +2 -0
  41. package/esm/types/safe.d.ts +5 -0
  42. package/esm/types/safe.js +1 -0
  43. package/package.json +2 -1
  44. package/src/config/contracts.ts +72 -0
  45. package/src/constants/index.ts +4 -1
  46. package/src/contracts.ts +57 -0
  47. package/src/execution/index.ts +12 -0
  48. package/src/execution/morpho.ts +47 -0
  49. package/src/index.ts +4 -0
  50. package/src/safe/index.ts +99 -0
  51. package/src/types/execution.ts +11 -0
  52. package/src/types/index.ts +3 -1
  53. package/src/types/safe.ts +5 -0
@@ -0,0 +1,37 @@
1
+ import { getContract } from 'viem';
2
+ import { NetworkNumber } from '@defisaver/positions-sdk';
3
+ import * as configRaw from './config/contracts';
4
+ // @ts-ignore
5
+ const contractConfig = configRaw;
6
+ export const getConfigContractAddress = (name, network) => {
7
+ const networkData = contractConfig[name].networks[network];
8
+ const latestAddress = (networkData === null || networkData === void 0 ? void 0 : networkData.address) || '';
9
+ return latestAddress;
10
+ };
11
+ export const getConfigContractAbi = (name) => {
12
+ const latestAbi = contractConfig[name].abi;
13
+ return latestAbi;
14
+ };
15
+ export const createContractFromConfigFunc = (name, _address) => (client, network) => {
16
+ const address = (_address || getConfigContractAddress(name, network));
17
+ const abi = getConfigContractAbi(name);
18
+ return getContract({
19
+ address,
20
+ abi,
21
+ client,
22
+ });
23
+ };
24
+ export const Safe130Contract = createContractFromConfigFunc('Safe130');
25
+ export const SafeFactoryContract = createContractFromConfigFunc('SafeProxyFactory130');
26
+ export const MorphoManagerContract = createContractFromConfigFunc('MorphoManager');
27
+ export const getSafeWalletContract = (client, address) => {
28
+ const abi = getConfigContractAbi('Safe130');
29
+ return getContract({
30
+ address,
31
+ abi,
32
+ client,
33
+ });
34
+ };
35
+ export const getSafeWalletSingletonAddress = (network) => getConfigContractAddress('Safe130', network || NetworkNumber.Eth);
36
+ export const getSafeFactoryAddress = (network) => getConfigContractAddress('SafeProxyFactory130', network || NetworkNumber.Eth);
37
+ export const getSafeFallbackHandlerAddress = (network) => getConfigContractAddress('SafeFallbackHandler130', network || NetworkNumber.Eth);
@@ -0,0 +1,2 @@
1
+ import { SupportedMarkets } from '../types';
2
+ export declare const getRequests: (market: SupportedMarkets) => import("../types").Request[];
@@ -0,0 +1,11 @@
1
+ import { SupportedMarkets } from '../types';
2
+ import { getMorphoRequests } from './morpho';
3
+ export const getRequests = (market) => {
4
+ switch (market) {
5
+ case SupportedMarkets.MorphoBlueSUSDeUSDtb_915: {
6
+ return getMorphoRequests();
7
+ }
8
+ default:
9
+ throw new Error(`Unsupported market: ${market}`);
10
+ }
11
+ };
@@ -0,0 +1,2 @@
1
+ import { Request } from '../types';
2
+ export declare const getMorphoRequests: () => Request[];
@@ -0,0 +1,52 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { MorphoManagerContract } from '../contracts';
11
+ import { getViemProvider } from '../services/viem';
12
+ import { RequestType } from '../types';
13
+ import { predictSafeAddress } from '../safe';
14
+ const morphoAuthSignature = {
15
+ type: RequestType.Signature,
16
+ getParams: (rpcUrl, network, userAddress) => __awaiter(void 0, void 0, void 0, function* () {
17
+ const provider = getViemProvider(rpcUrl, network);
18
+ const managerContract = MorphoManagerContract(provider, network);
19
+ const nonce = yield managerContract.read.nonce([userAddress]);
20
+ const tenMinutes = 1000 * 60 * 10;
21
+ const deadline = Date.now() + tenMinutes;
22
+ const safeAddress = yield predictSafeAddress(userAddress, rpcUrl, network);
23
+ return {
24
+ types: {
25
+ EIP712Domain: [
26
+ { name: 'verifyingContract', type: 'address' },
27
+ { name: 'chainId', type: 'uint256' },
28
+ ],
29
+ Authorization: [
30
+ { name: 'authorizer', type: 'address' },
31
+ { name: 'authorized', type: 'address' },
32
+ { name: 'isAuthorized', type: 'bool' },
33
+ { name: 'nonce', type: 'uint256' },
34
+ { name: 'deadline', type: 'uint256' },
35
+ ],
36
+ },
37
+ domain: {
38
+ chainId: network,
39
+ verifyingContract: managerContract.address,
40
+ },
41
+ primaryType: 'Authorization',
42
+ message: {
43
+ authorizer: userAddress,
44
+ authorized: safeAddress,
45
+ isAuthorized: true,
46
+ nonce: +nonce.toString(),
47
+ deadline,
48
+ },
49
+ };
50
+ }),
51
+ };
52
+ export const getMorphoRequests = () => [morphoAuthSignature];
package/esm/index.d.ts CHANGED
@@ -3,5 +3,7 @@ import * as positionData from './positionData';
3
3
  import * as marketData from './marketData';
4
4
  import * as exchange from './exchange';
5
5
  import * as constants from './constants';
6
+ import * as safe from './safe';
7
+ import * as execution from './execution';
6
8
  export * from './types';
7
- export { positionData, marketData, exchange, constants, };
9
+ export { positionData, marketData, exchange, constants, safe, execution, };
package/esm/index.js CHANGED
@@ -3,5 +3,7 @@ import * as positionData from './positionData';
3
3
  import * as marketData from './marketData';
4
4
  import * as exchange from './exchange';
5
5
  import * as constants from './constants';
6
+ import * as safe from './safe';
7
+ import * as execution from './execution';
6
8
  export * from './types';
7
- export { positionData, marketData, exchange, constants, };
9
+ export { positionData, marketData, exchange, constants, safe, execution, };
@@ -0,0 +1,6 @@
1
+ import { NetworkNumber } from '@defisaver/positions-sdk';
2
+ export declare const getSafeWallets: (userAddress: string, network: NetworkNumber) => Promise<{
3
+ success: boolean;
4
+ wallets: string[];
5
+ }>;
6
+ export declare const predictSafeAddress: (owner: string, rpcUrl: string, network: NetworkNumber) => Promise<string>;
@@ -0,0 +1,75 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { encodeFunctionData, encodePacked, getCreate2Address, keccak256, } from 'viem';
11
+ import { SAFE_API_URL, SAFE_REFUND_RECEIVER, SALT_PREFIX, ZERO_ADDRESS, } from '../constants';
12
+ import { getConfigContractAbi, getSafeFactoryAddress, getSafeFallbackHandlerAddress, getSafeWalletSingletonAddress, SafeFactoryContract, } from '../contracts';
13
+ import { getViemProvider } from '../services/viem';
14
+ export const getSafeWallets = (userAddress, network) => __awaiter(void 0, void 0, void 0, function* () {
15
+ try {
16
+ const res = yield fetch(`${SAFE_API_URL}/safe/all-wallets?network=${network}&account=${userAddress}`);
17
+ const wallets = yield res.json();
18
+ const oneOneWallets = wallets
19
+ .filter((wallet) => wallet.type === 'Safe' && (wallet.owners || []).length === 1)
20
+ .map((wallet) => wallet.address);
21
+ return { success: true, wallets: oneOneWallets };
22
+ }
23
+ catch (e) {
24
+ return { success: false, wallets: [] };
25
+ }
26
+ });
27
+ const getSafeSetupParams = (owners, threshold, network) => [
28
+ owners,
29
+ BigInt(threshold),
30
+ ZERO_ADDRESS,
31
+ '0x',
32
+ getSafeFallbackHandlerAddress(network),
33
+ ZERO_ADDRESS,
34
+ BigInt(0),
35
+ SAFE_REFUND_RECEIVER,
36
+ ];
37
+ const _predictSafeAddress = (rpcUrl, network, setupArgs, saltNonce) => __awaiter(void 0, void 0, void 0, function* () {
38
+ const provider = getViemProvider(rpcUrl, network);
39
+ const safeProxyFactoryAddress = getSafeFactoryAddress(network);
40
+ const safeProxyFactoryContract = SafeFactoryContract(provider, network);
41
+ const masterCopyAddress = getSafeWalletSingletonAddress(network);
42
+ const proxyCreationCode = yield safeProxyFactoryContract.read.proxyCreationCode();
43
+ // @ts-ignore
44
+ const initCodeHash = keccak256(encodePacked(['bytes', 'bytes'], [proxyCreationCode, masterCopyAddress.slice(2).padStart(64, '0')]), 'bytes');
45
+ const salt = keccak256(encodePacked(['bytes', 'uint256'], [keccak256(setupArgs), BigInt(saltNonce)]));
46
+ return getCreate2Address({
47
+ bytecodeHash: initCodeHash,
48
+ from: safeProxyFactoryAddress,
49
+ salt,
50
+ });
51
+ });
52
+ export const predictSafeAddress = (owner, rpcUrl, network) => __awaiter(void 0, void 0, void 0, function* () {
53
+ const provider = getViemProvider(rpcUrl, network);
54
+ const threshold = 1;
55
+ const owners = [owner];
56
+ const setupParams = getSafeSetupParams(owners, threshold, network);
57
+ const setupParamsEncoded = encodeFunctionData({
58
+ abi: getConfigContractAbi('Safe130'),
59
+ functionName: 'setup',
60
+ // @ts-ignore
61
+ args: setupParams,
62
+ });
63
+ const oneOfOneWalletsCount = (yield getSafeWallets(owner, network)).wallets.length;
64
+ const failAfter = 10;
65
+ for (let nonce = oneOfOneWalletsCount + 1; nonce < oneOfOneWalletsCount + failAfter + 1; nonce += 1) {
66
+ const salt = `${SALT_PREFIX}${nonce}`;
67
+ const predictedAddr = yield _predictSafeAddress(rpcUrl, network, setupParamsEncoded, salt);
68
+ const bytecode = yield provider.getCode({ address: predictedAddr });
69
+ if (!bytecode) {
70
+ // safe does not exist
71
+ return predictedAddr;
72
+ }
73
+ }
74
+ return '';
75
+ });
@@ -826,12 +826,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
826
826
  withdrawals?: import("viem").Withdrawal[] | undefined | undefined;
827
827
  withdrawalsRoot?: `0x${string}` | undefined;
828
828
  transactions: includeTransactions extends true ? ({
829
- type: "legacy";
830
829
  to: import("viem").Address | null;
830
+ value: bigint;
831
+ nonce: number;
832
+ type: "legacy";
831
833
  from: import("viem").Address;
832
834
  gas: bigint;
833
- nonce: number;
834
- value: bigint;
835
835
  maxFeePerBlobGas?: undefined | undefined;
836
836
  gasPrice: bigint;
837
837
  maxFeePerGas?: undefined | undefined;
@@ -851,12 +851,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
851
851
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
852
852
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
853
853
  } | {
854
- type: "eip2930";
855
854
  to: import("viem").Address | null;
855
+ value: bigint;
856
+ nonce: number;
857
+ type: "eip2930";
856
858
  from: import("viem").Address;
857
859
  gas: bigint;
858
- nonce: number;
859
- value: bigint;
860
860
  maxFeePerBlobGas?: undefined | undefined;
861
861
  gasPrice: bigint;
862
862
  maxFeePerGas?: undefined | undefined;
@@ -876,12 +876,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
876
876
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
877
877
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
878
878
  } | {
879
- type: "eip1559";
880
879
  to: import("viem").Address | null;
880
+ value: bigint;
881
+ nonce: number;
882
+ type: "eip1559";
881
883
  from: import("viem").Address;
882
884
  gas: bigint;
883
- nonce: number;
884
- value: bigint;
885
885
  maxFeePerBlobGas?: undefined | undefined;
886
886
  gasPrice?: undefined | undefined;
887
887
  maxFeePerGas: bigint;
@@ -901,12 +901,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
901
901
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
902
902
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
903
903
  } | {
904
- type: "eip4844";
905
904
  to: import("viem").Address | null;
905
+ value: bigint;
906
+ nonce: number;
907
+ type: "eip4844";
906
908
  from: import("viem").Address;
907
909
  gas: bigint;
908
- nonce: number;
909
- value: bigint;
910
910
  maxFeePerBlobGas: bigint;
911
911
  gasPrice?: undefined | undefined;
912
912
  maxFeePerGas: bigint;
@@ -926,12 +926,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
926
926
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
927
927
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
928
928
  } | {
929
- type: "eip7702";
930
929
  to: import("viem").Address | null;
930
+ value: bigint;
931
+ nonce: number;
932
+ type: "eip7702";
931
933
  from: import("viem").Address;
932
934
  gas: bigint;
933
- nonce: number;
934
- value: bigint;
935
935
  maxFeePerBlobGas?: undefined | undefined;
936
936
  gasPrice?: undefined | undefined;
937
937
  maxFeePerGas: bigint;
@@ -976,12 +976,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
976
976
  } | undefined) => Promise<import("viem").EstimateMaxPriorityFeePerGasReturnType>;
977
977
  getStorageAt: (args: import("viem").GetStorageAtParameters) => Promise<import("viem").GetStorageAtReturnType>;
978
978
  getTransaction: <blockTag extends import("viem").BlockTag = "latest">(args: import("viem").GetTransactionParameters<blockTag>) => Promise<{
979
- type: "legacy";
980
979
  to: import("viem").Address | null;
980
+ value: bigint;
981
+ nonce: number;
982
+ type: "legacy";
981
983
  from: import("viem").Address;
982
984
  gas: bigint;
983
- nonce: number;
984
- value: bigint;
985
985
  maxFeePerBlobGas?: undefined | undefined;
986
986
  gasPrice: bigint;
987
987
  maxFeePerGas?: undefined | undefined;
@@ -1001,12 +1001,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
1001
1001
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
1002
1002
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
1003
1003
  } | {
1004
- type: "eip2930";
1005
1004
  to: import("viem").Address | null;
1005
+ value: bigint;
1006
+ nonce: number;
1007
+ type: "eip2930";
1006
1008
  from: import("viem").Address;
1007
1009
  gas: bigint;
1008
- nonce: number;
1009
- value: bigint;
1010
1010
  maxFeePerBlobGas?: undefined | undefined;
1011
1011
  gasPrice: bigint;
1012
1012
  maxFeePerGas?: undefined | undefined;
@@ -1026,12 +1026,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
1026
1026
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
1027
1027
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
1028
1028
  } | {
1029
- type: "eip1559";
1030
1029
  to: import("viem").Address | null;
1030
+ value: bigint;
1031
+ nonce: number;
1032
+ type: "eip1559";
1031
1033
  from: import("viem").Address;
1032
1034
  gas: bigint;
1033
- nonce: number;
1034
- value: bigint;
1035
1035
  maxFeePerBlobGas?: undefined | undefined;
1036
1036
  gasPrice?: undefined | undefined;
1037
1037
  maxFeePerGas: bigint;
@@ -1051,12 +1051,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
1051
1051
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
1052
1052
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
1053
1053
  } | {
1054
- type: "eip4844";
1055
1054
  to: import("viem").Address | null;
1055
+ value: bigint;
1056
+ nonce: number;
1057
+ type: "eip4844";
1056
1058
  from: import("viem").Address;
1057
1059
  gas: bigint;
1058
- nonce: number;
1059
- value: bigint;
1060
1060
  maxFeePerBlobGas: bigint;
1061
1061
  gasPrice?: undefined | undefined;
1062
1062
  maxFeePerGas: bigint;
@@ -1076,12 +1076,12 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
1076
1076
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
1077
1077
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
1078
1078
  } | {
1079
- type: "eip7702";
1080
1079
  to: import("viem").Address | null;
1080
+ value: bigint;
1081
+ nonce: number;
1082
+ type: "eip7702";
1081
1083
  from: import("viem").Address;
1082
1084
  gas: bigint;
1083
- nonce: number;
1084
- value: bigint;
1085
1085
  maxFeePerBlobGas?: undefined | undefined;
1086
1086
  gasPrice?: undefined | undefined;
1087
1087
  maxFeePerGas: bigint;
@@ -4357,7 +4357,7 @@ export declare const getViemProvider: (rpcUrl: string, network: NetworkNumber, o
4357
4357
  authorizationList: import("viem").TransactionSerializableEIP7702["authorizationList"];
4358
4358
  } ? "eip7702" : never) | (request["type"] extends string | undefined ? Extract<request["type"], string> : never)>) ? T_12 extends "eip7702" ? import("viem").TransactionRequestEIP7702 : never : never : never)>> & {
4359
4359
  chainId?: number | undefined;
4360
- }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4360
+ }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "nonce" | "type" | "gas" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "nonce" | "type" | "gas" | "blobVersionedHashes" | "fees" | "chainId") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4361
4361
  readContract: <const abi extends import("viem").Abi | readonly unknown[], functionName extends import("viem").ContractFunctionName<abi, "pure" | "view">, const args extends import("viem").ContractFunctionArgs<abi, "pure" | "view", functionName>>(args: import("viem").ReadContractParameters<abi, functionName, args>) => Promise<import("viem").ReadContractReturnType<abi, functionName, args>>;
4362
4362
  sendRawTransaction: (args: import("viem").SendRawTransactionParameters) => Promise<import("viem").SendRawTransactionReturnType>;
4363
4363
  simulate: <const calls extends readonly unknown[]>(args: import("viem").SimulateBlocksParameters<calls>) => Promise<import("viem").SimulateBlocksReturnType<calls>>;
@@ -0,0 +1,9 @@
1
+ import { NetworkNumber } from '@defisaver/positions-sdk';
2
+ export declare enum RequestType {
3
+ Signature = "Signature",
4
+ EthCall = "EthCall"
5
+ }
6
+ export interface Request {
7
+ type: RequestType;
8
+ getParams: (rpcUrl: string, network: NetworkNumber, userAddress: string) => Promise<any>;
9
+ }
@@ -0,0 +1,5 @@
1
+ export var RequestType;
2
+ (function (RequestType) {
3
+ RequestType["Signature"] = "Signature";
4
+ RequestType["EthCall"] = "EthCall";
5
+ })(RequestType || (RequestType = {}));
@@ -1,3 +1,5 @@
1
1
  export * from './common';
2
2
  export * from './markets';
3
3
  export * from './exchange';
4
+ export * from './safe';
5
+ export * from './execution';
@@ -1,3 +1,5 @@
1
1
  export * from './common';
2
2
  export * from './markets';
3
3
  export * from './exchange';
4
+ export * from './safe';
5
+ export * from './execution';
@@ -0,0 +1,5 @@
1
+ export type Wallet = {
2
+ address: string;
3
+ type: string;
4
+ owners?: string[];
5
+ };
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/ethena-sdk",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "SDK for ethena lev create",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -26,6 +26,7 @@
26
26
  "homepage": "https://github.com/defisaver/ethena-sdk#readme",
27
27
  "dependencies": {
28
28
  "@defisaver/positions-sdk": "^2.1.57",
29
+ "@defisaver/sdk": "^1.3.18",
29
30
  "@defisaver/tokens": "^1.7.22",
30
31
  "bn.js": "^5.1.3",
31
32
  "decimal.js": "^10.6.0",
@@ -0,0 +1,72 @@
1
+ export const Safe130 = {
2
+ abi: [{
3
+ inputs: [{ internalType: 'address[]', name: '_owners', type: 'address[]' }, { internalType: 'uint256', name: '_threshold', type: 'uint256' }, { internalType: 'address', name: 'to', type: 'address' }, { internalType: 'bytes', name: 'data', type: 'bytes' }, { internalType: 'address', name: 'fallbackHandler', type: 'address' }, { internalType: 'address', name: 'paymentToken', type: 'address' }, { internalType: 'uint256', name: 'payment', type: 'uint256' }, { internalType: 'address payable', name: 'paymentReceiver', type: 'address' }], name: 'setup', outputs: [], stateMutability: 'pure', type: 'function',
4
+ }],
5
+ networks: {
6
+ 1: {
7
+ address: '0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552',
8
+ },
9
+ 10: {
10
+ address: '0xfb1bffC9d739B8D520DaF37dF666da4C687191EA',
11
+ },
12
+ 8453: {
13
+ address: '0xfb1bffC9d739B8D520DaF37dF666da4C687191EA',
14
+ },
15
+ 42161: {
16
+ address: '0x3E5c63644E683549055b9Be8653de26E0B4CD36E',
17
+ },
18
+ },
19
+ } as const;
20
+
21
+ export const SafeFallbackHandler130 = {
22
+ abi: [{ inputs: [], stateMutability: 'nonpayable', type: 'constructor' }, {
23
+ inputs: [{ internalType: 'address', name: 'to', type: 'address' }, { internalType: 'uint256', name: 'value', type: 'uint256' }, { internalType: 'bytes', name: 'data', type: 'bytes' }, { internalType: 'enum Enum.Operation', name: 'operation', type: 'uint8' }], name: 'simulate', outputs: [{ internalType: 'uint256', name: 'estimate', type: 'uint256' }, { internalType: 'bool', name: 'success', type: 'bool' }, { internalType: 'bytes', name: 'returnData', type: 'bytes' }], stateMutability: 'nonpayable', type: 'function',
24
+ }],
25
+ networks: {
26
+ 1: {
27
+ address: '0xf48f2B2d2a534e402487b3ee7C18c33Aec0Fe5e4',
28
+ },
29
+ 10: {
30
+ address: '0x017062a1dE2FE6b99BE3d9d37841FeD19F573804',
31
+ },
32
+ 8453: {
33
+ address: '0x017062a1dE2FE6b99BE3d9d37841FeD19F573804',
34
+ },
35
+ 42161: {
36
+ address: '0xf48f2B2d2a534e402487b3ee7C18c33Aec0Fe5e4',
37
+ },
38
+ },
39
+ } as const;
40
+
41
+ export const SafeProxyFactory130 = {
42
+ abi: [{
43
+ inputs: [{ internalType: 'address', name: '_singleton', type: 'address' }, { internalType: 'bytes', name: 'initializer', type: 'bytes' }, { internalType: 'uint256', name: 'saltNonce', type: 'uint256' }], name: 'createProxyWithNonce', outputs: [{ internalType: 'contract GnosisSafeProxy', name: 'proxy', type: 'address' }], stateMutability: 'nonpayable', type: 'function',
44
+ }, {
45
+ inputs: [], name: 'proxyCreationCode', outputs: [{ internalType: 'bytes', name: '', type: 'bytes' }], stateMutability: 'pure', type: 'function',
46
+ }],
47
+ networks: {
48
+ 1: {
49
+ address: '0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2',
50
+ },
51
+ 10: {
52
+ address: '0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC',
53
+ },
54
+ 8453: {
55
+ address: '0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC',
56
+ },
57
+ 42161: {
58
+ address: '0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2',
59
+ },
60
+ },
61
+ } as const;
62
+
63
+ export const MorphoManager = {
64
+ abi: [{
65
+ inputs: [{ internalType: 'address', name: '', type: 'address' }], name: 'nonce', outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }], stateMutability: 'view', type: 'function',
66
+ }],
67
+ networks: {
68
+ 1: {
69
+ address: '0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb',
70
+ },
71
+ },
72
+ } as const;
@@ -1,4 +1,7 @@
1
1
  export const STABLE_PAIR_FEE_DIVIDER = '10000';
2
2
  export const DFS_API_URL = 'https://fe.defisaver.com';
3
+ export const SAFE_API_URL = 'https://fe.defisaver.com';
3
4
  export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
4
- export const SLIPPAGE_PERCENT = 0.05;
5
+ export const SLIPPAGE_PERCENT = 0.05;
6
+ export const SAFE_REFUND_RECEIVER = '0x25aa0f9a42eE4Ea2Dc7f3c9fF02F558dcb0445a3';
7
+ export const SALT_PREFIX = '44654669205361766572'; // 'DeFi Saver' in hex
@@ -0,0 +1,57 @@
1
+ import { getContract, Client } from 'viem';
2
+ import { EthAddress, HexString, NetworkNumber } from '@defisaver/positions-sdk';
3
+ import * as configRaw from './config/contracts';
4
+
5
+ export type ConfigKey = keyof typeof configRaw;
6
+
7
+ declare type ContractConfig = {
8
+ abi: any[],
9
+ networks: Partial<Record<NetworkNumber, Network>>,
10
+ };
11
+ declare type Network = {
12
+ createdBlock?: number,
13
+ address: string,
14
+ oldVersions?: Record<string, { address: EthAddress, abi: any[] }>,
15
+ };
16
+ // @ts-ignore
17
+ const contractConfig:Record<ConfigKey, ContractConfig> = configRaw;
18
+
19
+ export const getConfigContractAddress = (name: ConfigKey, network: NetworkNumber): HexString => {
20
+ const networkData = contractConfig[name].networks[network];
21
+ const latestAddress = networkData?.address || '';
22
+ return latestAddress as HexString;
23
+ };
24
+
25
+ export const getConfigContractAbi = <TKey extends ConfigKey>(name: TKey): typeof configRaw[TKey]['abi'] => {
26
+ const latestAbi = contractConfig[name].abi;
27
+ return latestAbi as unknown as typeof configRaw[TKey]['abi'];
28
+ };
29
+
30
+ export const createContractFromConfigFunc = <TKey extends ConfigKey>(name: TKey, _address?: HexString) => (client: Client, network: NetworkNumber) => {
31
+ const address = (_address || getConfigContractAddress(name, network));
32
+ const abi = getConfigContractAbi(name) as typeof configRaw[TKey]['abi'];
33
+ return getContract({
34
+ address,
35
+ abi,
36
+ client,
37
+ });
38
+ };
39
+
40
+ export const Safe130Contract = createContractFromConfigFunc('Safe130');
41
+ export const SafeFactoryContract = createContractFromConfigFunc('SafeProxyFactory130');
42
+ export const MorphoManagerContract = createContractFromConfigFunc('MorphoManager');
43
+
44
+ export const getSafeWalletContract = (client: Client, address: HexString) => {
45
+ const abi = getConfigContractAbi('Safe130') as typeof configRaw['Safe130']['abi'];
46
+ return getContract({
47
+ address,
48
+ abi,
49
+ client,
50
+ });
51
+ };
52
+
53
+ export const getSafeWalletSingletonAddress = (network?: NetworkNumber) => getConfigContractAddress('Safe130', network || NetworkNumber.Eth);
54
+
55
+ export const getSafeFactoryAddress = (network?: NetworkNumber) => getConfigContractAddress('SafeProxyFactory130', network || NetworkNumber.Eth);
56
+
57
+ export const getSafeFallbackHandlerAddress = (network?: NetworkNumber) => getConfigContractAddress('SafeFallbackHandler130', network || NetworkNumber.Eth);
@@ -0,0 +1,12 @@
1
+ import { SupportedMarkets } from '../types';
2
+ import { getMorphoRequests } from './morpho';
3
+
4
+ export const getRequests = (market: SupportedMarkets) => {
5
+ switch (market) {
6
+ case SupportedMarkets.MorphoBlueSUSDeUSDtb_915: {
7
+ return getMorphoRequests();
8
+ }
9
+ default:
10
+ throw new Error(`Unsupported market: ${market}`);
11
+ }
12
+ };
@@ -0,0 +1,47 @@
1
+ import { NetworkNumber } from '@defisaver/positions-sdk';
2
+ import { MorphoManagerContract } from '../contracts';
3
+ import { getViemProvider } from '../services/viem';
4
+ import { Request, RequestType } from '../types';
5
+ import { predictSafeAddress } from '../safe';
6
+
7
+ const morphoAuthSignature: Request = {
8
+ type: RequestType.Signature,
9
+ getParams: async (rpcUrl: string, network: NetworkNumber, userAddress: string) => {
10
+ const provider = getViemProvider(rpcUrl, network);
11
+ const managerContract = MorphoManagerContract(provider, network);
12
+ const nonce = await managerContract.read.nonce([userAddress as `0x${string}`]);
13
+ const tenMinutes = 1000 * 60 * 10;
14
+ const deadline = Date.now() + tenMinutes;
15
+ const safeAddress = await predictSafeAddress(userAddress, rpcUrl, network);
16
+
17
+ return {
18
+ types: {
19
+ EIP712Domain: [
20
+ { name: 'verifyingContract', type: 'address' },
21
+ { name: 'chainId', type: 'uint256' },
22
+ ],
23
+ Authorization: [
24
+ { name: 'authorizer', type: 'address' },
25
+ { name: 'authorized', type: 'address' },
26
+ { name: 'isAuthorized', type: 'bool' },
27
+ { name: 'nonce', type: 'uint256' },
28
+ { name: 'deadline', type: 'uint256' },
29
+ ],
30
+ },
31
+ domain: {
32
+ chainId: network,
33
+ verifyingContract: managerContract.address,
34
+ },
35
+ primaryType: 'Authorization',
36
+ message: {
37
+ authorizer: userAddress,
38
+ authorized: safeAddress,
39
+ isAuthorized: true,
40
+ nonce: +nonce.toString(),
41
+ deadline,
42
+ },
43
+ };
44
+ },
45
+ };
46
+
47
+ export const getMorphoRequests = () => [morphoAuthSignature];