@haven-fi/solauto-sdk 1.0.214 → 1.0.216
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/clients/referralStateManager.d.ts +6 -5
- package/dist/clients/referralStateManager.d.ts.map +1 -1
- package/dist/clients/referralStateManager.js +9 -10
- package/dist/clients/solautoClient.d.ts +6 -15
- package/dist/clients/solautoClient.d.ts.map +1 -1
- package/dist/clients/solautoClient.js +15 -42
- package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/clients/solautoMarginfiClient.js +10 -9
- package/dist/clients/txHandler.d.ts +1 -4
- package/dist/clients/txHandler.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +14 -10
- package/package.json +1 -1
- package/src/clients/referralStateManager.ts +17 -15
- package/src/clients/solautoClient.ts +19 -74
- package/src/clients/solautoMarginfiClient.ts +11 -9
- package/src/clients/txHandler.ts +0 -5
- package/src/transactions/transactionUtils.ts +19 -14
- package/tests/transactions/solautoMarginfi.ts +4 -4
|
@@ -3,20 +3,22 @@ import { Signer, TransactionBuilder, Umi } from "@metaplex-foundation/umi";
|
|
|
3
3
|
import { WalletAdapter } from "@metaplex-foundation/umi-signer-wallet-adapters";
|
|
4
4
|
import { ReferralState } from "../generated";
|
|
5
5
|
import { TxHandler } from "./txHandler";
|
|
6
|
-
interface ReferralStateManagerArgs {
|
|
6
|
+
export interface ReferralStateManagerArgs {
|
|
7
7
|
signer?: Signer;
|
|
8
8
|
wallet?: WalletAdapter;
|
|
9
|
-
|
|
9
|
+
authority?: PublicKey;
|
|
10
10
|
referredByAuthority?: PublicKey;
|
|
11
11
|
}
|
|
12
12
|
export declare class ReferralStateManager extends TxHandler {
|
|
13
13
|
localTest?: boolean | undefined;
|
|
14
14
|
umi: Umi;
|
|
15
15
|
signer: Signer;
|
|
16
|
-
|
|
16
|
+
authority: PublicKey;
|
|
17
17
|
referralState: PublicKey;
|
|
18
18
|
referralStateData: ReferralState | null;
|
|
19
|
-
|
|
19
|
+
referredBy?: PublicKey;
|
|
20
|
+
referredByState?: PublicKey;
|
|
21
|
+
constructor(rpcUrl: string, localTest?: boolean | undefined);
|
|
20
22
|
initialize(args: ReferralStateManagerArgs): Promise<void>;
|
|
21
23
|
defaultLookupTables(): string[];
|
|
22
24
|
setReferredBy(referredBy?: PublicKey): void;
|
|
@@ -24,5 +26,4 @@ export declare class ReferralStateManager extends TxHandler {
|
|
|
24
26
|
claimReferralFeesIx(destFeesMint?: PublicKey): TransactionBuilder;
|
|
25
27
|
resetLiveTxUpdates(success?: boolean): Promise<void>;
|
|
26
28
|
}
|
|
27
|
-
export {};
|
|
28
29
|
//# sourceMappingURL=referralStateManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"referralStateManager.d.ts","sourceRoot":"","sources":["../../src/clients/referralStateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAEL,MAAM,EAEN,kBAAkB,EAClB,GAAG,EACJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,aAAa,EAEd,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAGL,aAAa,EAGd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,
|
|
1
|
+
{"version":3,"file":"referralStateManager.d.ts","sourceRoot":"","sources":["../../src/clients/referralStateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAEL,MAAM,EAEN,kBAAkB,EAClB,GAAG,EACJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,aAAa,EAEd,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAGL,aAAa,EAGd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,mBAAmB,CAAC,EAAE,SAAS,CAAC;CACjC;AAED,qBAAa,oBAAqB,SAAQ,SAAS;IAaxC,SAAS,CAAC,EAAE,OAAO;IAZrB,GAAG,EAAG,GAAG,CAAC;IACV,MAAM,EAAG,MAAM,CAAC;IAEhB,SAAS,EAAG,SAAS,CAAC;IACtB,aAAa,EAAG,SAAS,CAAC;IAC1B,iBAAiB,EAAG,aAAa,GAAG,IAAI,CAAC;IAEzC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,eAAe,CAAC,EAAE,SAAS,CAAC;gBAGjC,MAAM,EAAE,MAAM,EACP,SAAS,CAAC,EAAE,OAAO,YAAA;IAUtB,UAAU,CAAC,IAAI,EAAE,wBAAwB;IAwB/C,mBAAmB,IAAI,MAAM,EAAE;IAS/B,aAAa,CAAC,UAAU,CAAC,EAAE,SAAS;IAmBpC,sBAAsB,CACpB,YAAY,CAAC,EAAE,SAAS,EACxB,WAAW,CAAC,EAAE,SAAS,GACtB,kBAAkB;IAerB,mBAAmB,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,kBAAkB;IA8B3D,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAC3D"}
|
|
@@ -11,8 +11,8 @@ const utils_1 = require("../utils");
|
|
|
11
11
|
const txHandler_1 = require("./txHandler");
|
|
12
12
|
const constants_1 = require("../constants");
|
|
13
13
|
class ReferralStateManager extends txHandler_1.TxHandler {
|
|
14
|
-
constructor(
|
|
15
|
-
super(
|
|
14
|
+
constructor(rpcUrl, localTest) {
|
|
15
|
+
super(rpcUrl, localTest);
|
|
16
16
|
this.localTest = localTest;
|
|
17
17
|
this.umi = this.umi.use({
|
|
18
18
|
install(umi) {
|
|
@@ -28,7 +28,8 @@ class ReferralStateManager extends txHandler_1.TxHandler {
|
|
|
28
28
|
? (0, umi_1.signerIdentity)(args.signer)
|
|
29
29
|
: (0, umi_signer_wallet_adapters_1.walletAdapterIdentity)(args.wallet, true));
|
|
30
30
|
this.signer = this.umi.identity;
|
|
31
|
-
this.
|
|
31
|
+
this.authority = args.authority ?? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey);
|
|
32
|
+
this.referralState = (0, utils_1.getReferralState)(args.authority ?? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey));
|
|
32
33
|
this.referralStateData = await (0, generated_1.safeFetchReferralState)(this.umi, (0, umi_1.publicKey)(this.referralState), { commitment: "confirmed" });
|
|
33
34
|
this.setReferredBy(args.referredByAuthority);
|
|
34
35
|
}
|
|
@@ -39,10 +40,8 @@ class ReferralStateManager extends txHandler_1.TxHandler {
|
|
|
39
40
|
: [constants_1.SOLAUTO_LUT];
|
|
40
41
|
}
|
|
41
42
|
setReferredBy(referredBy) {
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
authorityReferralStateData.referredByState !==
|
|
45
|
-
(0, umi_1.publicKey)(web3_js_1.PublicKey.default);
|
|
43
|
+
const hasReferredBy = this.referralStateData &&
|
|
44
|
+
this.referralStateData.referredByState !== (0, umi_1.publicKey)(web3_js_1.PublicKey.default);
|
|
46
45
|
const finalReferredBy = !hasReferredBy &&
|
|
47
46
|
referredBy &&
|
|
48
47
|
!referredBy.equals((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey))
|
|
@@ -51,8 +50,8 @@ class ReferralStateManager extends txHandler_1.TxHandler {
|
|
|
51
50
|
this.referredBy = finalReferredBy;
|
|
52
51
|
this.referredByState = finalReferredBy
|
|
53
52
|
? (0, utils_1.getReferralState)(finalReferredBy)
|
|
54
|
-
:
|
|
55
|
-
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(
|
|
53
|
+
: this.referralStateData
|
|
54
|
+
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.referralStateData.referredByState)
|
|
56
55
|
: undefined;
|
|
57
56
|
}
|
|
58
57
|
updateReferralStatesIx(destFeesMint, lookupTable) {
|
|
@@ -78,7 +77,7 @@ class ReferralStateManager extends txHandler_1.TxHandler {
|
|
|
78
77
|
return (0, generated_1.claimReferralFees)(this.umi, {
|
|
79
78
|
signer: this.signer,
|
|
80
79
|
signerWsolTa: (0, umi_1.publicKey)((0, utils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), spl_token_1.NATIVE_MINT)),
|
|
81
|
-
referralAuthority: (0, umi_1.publicKey)(this.
|
|
80
|
+
referralAuthority: (0, umi_1.publicKey)(this.authority),
|
|
82
81
|
referralState: (0, umi_1.publicKey)(this.referralState),
|
|
83
82
|
referralFeesDestTa: (0, umi_1.publicKey)(referralDestTa),
|
|
84
83
|
referralFeesDestMint: (0, umi_1.publicKey)(referralFeesDestMint),
|
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
import "rpc-websockets/dist/lib/client";
|
|
2
2
|
import { PublicKey } from "@solana/web3.js";
|
|
3
3
|
import { Signer, TransactionBuilder } from "@metaplex-foundation/umi";
|
|
4
|
-
import { WalletAdapter } from "@metaplex-foundation/umi-signer-wallet-adapters";
|
|
5
4
|
import { DCASettings, DCASettingsInpArgs, LendingPlatform, PositionState, SolautoActionArgs, SolautoPosition, SolautoRebalanceTypeArgs, SolautoSettingsParameters, SolautoSettingsParametersInpArgs, UpdatePositionDataArgs } from "../generated";
|
|
6
5
|
import { FlashLoanDetails } from "../utils/solauto/rebalanceUtils";
|
|
7
6
|
import { LivePositionUpdates } from "../utils/solauto/generalUtils";
|
|
8
|
-
import { ReferralStateManager } from "./referralStateManager";
|
|
9
|
-
import { TxHandler } from "./txHandler";
|
|
7
|
+
import { ReferralStateManager, ReferralStateManagerArgs } from "./referralStateManager";
|
|
10
8
|
import { QuoteResponse } from "@jup-ag/api";
|
|
11
|
-
export interface SolautoClientArgs {
|
|
9
|
+
export interface SolautoClientArgs extends ReferralStateManagerArgs {
|
|
12
10
|
new?: boolean;
|
|
13
|
-
authority?: PublicKey;
|
|
14
11
|
positionId?: number;
|
|
15
|
-
signer?: Signer;
|
|
16
|
-
wallet?: WalletAdapter;
|
|
17
12
|
supplyMint?: PublicKey;
|
|
18
13
|
debtMint?: PublicKey;
|
|
19
|
-
referredByAuthority?: PublicKey;
|
|
20
14
|
}
|
|
21
|
-
export declare abstract class SolautoClient extends
|
|
22
|
-
lendingPlatform
|
|
15
|
+
export declare abstract class SolautoClient extends ReferralStateManager {
|
|
16
|
+
lendingPlatform?: LendingPlatform;
|
|
23
17
|
authority: PublicKey;
|
|
24
18
|
signer: Signer;
|
|
25
19
|
positionId: number;
|
|
@@ -35,15 +29,12 @@ export declare abstract class SolautoClient extends TxHandler {
|
|
|
35
29
|
debtMint: PublicKey;
|
|
36
30
|
positionDebtTa: PublicKey;
|
|
37
31
|
signerDebtTa: PublicKey;
|
|
38
|
-
referralStateManager: ReferralStateManager;
|
|
39
|
-
referredBySupplyTa?: PublicKey;
|
|
40
32
|
solautoFeesWallet: PublicKey;
|
|
41
33
|
solautoFeesSupplyTa: PublicKey;
|
|
42
34
|
authorityLutAddress?: PublicKey;
|
|
43
35
|
livePositionUpdates: LivePositionUpdates;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
setReferredBy(referredBy?: PublicKey): void;
|
|
36
|
+
initialize(args: SolautoClientArgs): Promise<void>;
|
|
37
|
+
referredBySupplyTa(): PublicKey | undefined;
|
|
47
38
|
resetLiveTxUpdates(success?: boolean): Promise<void>;
|
|
48
39
|
abstract protocolAccount(): PublicKey;
|
|
49
40
|
defaultLookupTables(): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EACL,MAAM,EACN,kBAAkB,
|
|
1
|
+
{"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,6 @@ require("rpc-websockets/dist/lib/client");
|
|
|
5
5
|
const web3_js_1 = require("@solana/web3.js");
|
|
6
6
|
const umi_1 = require("@metaplex-foundation/umi");
|
|
7
7
|
const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
|
|
8
|
-
const umi_signer_wallet_adapters_1 = require("@metaplex-foundation/umi-signer-wallet-adapters");
|
|
9
8
|
const generated_1 = require("../generated");
|
|
10
9
|
const accountUtils_1 = require("../utils/accountUtils");
|
|
11
10
|
const generalAccounts_1 = require("../constants/generalAccounts");
|
|
@@ -14,29 +13,15 @@ const solautoConstants_1 = require("../constants/solautoConstants");
|
|
|
14
13
|
const generalUtils_1 = require("../utils/generalUtils");
|
|
15
14
|
const generalUtils_2 = require("../utils/solauto/generalUtils");
|
|
16
15
|
const referralStateManager_1 = require("./referralStateManager");
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
super(rpcUrl, localTest);
|
|
16
|
+
class SolautoClient extends referralStateManager_1.ReferralStateManager {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
21
19
|
this.livePositionUpdates = new generalUtils_2.LivePositionUpdates();
|
|
22
|
-
this.umi = this.umi.use({
|
|
23
|
-
install(umi) {
|
|
24
|
-
umi.programs.add((0, generated_1.createSolautoProgram)(), false);
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
20
|
}
|
|
28
|
-
async initialize(args
|
|
29
|
-
|
|
30
|
-
throw new Error("Signer or wallet must be provided");
|
|
31
|
-
}
|
|
32
|
-
this.umi = this.umi.use(args.signer
|
|
33
|
-
? (0, umi_1.signerIdentity)(args.signer)
|
|
34
|
-
: (0, umi_signer_wallet_adapters_1.walletAdapterIdentity)(args.wallet, true));
|
|
35
|
-
this.signer = this.umi.identity;
|
|
36
|
-
this.authority = args.authority ?? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey);
|
|
21
|
+
async initialize(args) {
|
|
22
|
+
await super.initialize(args);
|
|
37
23
|
this.positionId = args.positionId ?? 0;
|
|
38
24
|
this.selfManaged = this.positionId === 0;
|
|
39
|
-
this.lendingPlatform = lendingPlatform;
|
|
40
25
|
this.solautoPosition = (0, accountUtils_1.getSolautoPositionAccount)(this.authority, this.positionId);
|
|
41
26
|
this.solautoPositionData = !args.new
|
|
42
27
|
? await (0, generated_1.safeFetchSolautoPosition)(this.umi, (0, umi_1.publicKey)(this.solautoPosition), { commitment: "confirmed" })
|
|
@@ -58,24 +43,12 @@ class SolautoClient extends txHandler_1.TxHandler {
|
|
|
58
43
|
: web3_js_1.PublicKey.default);
|
|
59
44
|
this.positionDebtTa = (0, accountUtils_1.getTokenAccount)(this.solautoPosition, this.debtMint);
|
|
60
45
|
this.signerDebtTa = (0, accountUtils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), this.debtMint);
|
|
61
|
-
this.referralStateManager = new referralStateManager_1.ReferralStateManager(this.rpcUrl);
|
|
62
|
-
await this.referralStateManager.initialize({
|
|
63
|
-
referralAuthority: this.authority,
|
|
64
|
-
referredByAuthority: args.referredByAuthority,
|
|
65
|
-
signer: args.signer,
|
|
66
|
-
wallet: args.wallet,
|
|
67
|
-
});
|
|
68
|
-
console.log(this.referralStateManager.referredBy?.toString());
|
|
69
|
-
if (this.referralStateManager.referredByState !== undefined) {
|
|
70
|
-
this.referredBySupplyTa = (0, accountUtils_1.getTokenAccount)(this.referralStateManager.referredByState, this.supplyMint);
|
|
71
|
-
}
|
|
72
46
|
this.solautoFeesWallet = generalAccounts_1.SOLAUTO_FEES_WALLET;
|
|
73
47
|
this.solautoFeesSupplyTa = (0, accountUtils_1.getTokenAccount)(this.solautoFeesWallet, this.supplyMint);
|
|
74
|
-
const authorityReferralStateData = this.referralStateManager.referralStateData;
|
|
75
48
|
this.authorityLutAddress =
|
|
76
|
-
|
|
77
|
-
!(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(
|
|
78
|
-
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(
|
|
49
|
+
this.referralStateData?.lookupTable &&
|
|
50
|
+
!(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.referralStateData.lookupTable).equals(web3_js_1.PublicKey.default)
|
|
51
|
+
? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.referralStateData.lookupTable)
|
|
79
52
|
: undefined;
|
|
80
53
|
this.log("Position state: ", this.solautoPositionState);
|
|
81
54
|
this.log("Position settings: ", this.solautoPositionData?.position?.settingParams);
|
|
@@ -84,11 +57,11 @@ class SolautoClient extends txHandler_1.TxHandler {
|
|
|
84
57
|
? this.solautoPositionData?.position?.dca
|
|
85
58
|
: undefined);
|
|
86
59
|
}
|
|
87
|
-
|
|
88
|
-
this.
|
|
89
|
-
|
|
90
|
-
this.referredBySupplyTa = (0, accountUtils_1.getTokenAccount)(this.referralStateManager.referredByState, this.supplyMint);
|
|
60
|
+
referredBySupplyTa() {
|
|
61
|
+
if (this.referredByState !== undefined) {
|
|
62
|
+
return (0, accountUtils_1.getTokenAccount)(this.referredByState, this.supplyMint);
|
|
91
63
|
}
|
|
64
|
+
return undefined;
|
|
92
65
|
}
|
|
93
66
|
async resetLiveTxUpdates(success) {
|
|
94
67
|
if (success) {
|
|
@@ -129,8 +102,8 @@ class SolautoClient extends txHandler_1.TxHandler {
|
|
|
129
102
|
this.solautoPosition,
|
|
130
103
|
this.positionSupplyTa,
|
|
131
104
|
this.positionDebtTa,
|
|
132
|
-
this.
|
|
133
|
-
...(this.referredBySupplyTa ? [this.referredBySupplyTa] : []),
|
|
105
|
+
this.referralState,
|
|
106
|
+
...(this.referredBySupplyTa() ? [this.referredBySupplyTa()] : []),
|
|
134
107
|
];
|
|
135
108
|
}
|
|
136
109
|
async fetchExistingAuthorityLutAccounts() {
|
|
@@ -172,7 +145,7 @@ class SolautoClient extends txHandler_1.TxHandler {
|
|
|
172
145
|
}
|
|
173
146
|
const addingReferredBy = accountsToAdd.length === 1 &&
|
|
174
147
|
accountsToAdd[0].toString().toLowerCase() ===
|
|
175
|
-
this.referredBySupplyTa?.toString().toLowerCase();
|
|
148
|
+
this.referredBySupplyTa()?.toString().toLowerCase();
|
|
176
149
|
if (tx.getInstructions().length > 0) {
|
|
177
150
|
this.log("Updating authority lookup table...");
|
|
178
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAM1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EAEb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAG5B,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;
|
|
1
|
+
{"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAM1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EAEb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAQnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAG5B,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IA+D1C,8BAA8B;IA0CpC,eAAe,IAAI,SAAS;IAI5B,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,IAAI,SAAS,EAAE;IAUzB,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IA0BvE,yBAAyB,IAAI,kBAAkB;IAS/C,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA6C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA0D5C,SAAS,CACP,aAAa,EAAE,GAAG,GAAG,GAAG,EACxB,QAAQ,EAAE,aAAa,EACvB,aAAa,EAAE,wBAAwB,EACvC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,GACnC,kBAAkB;IAqErB,WAAW,CACT,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,SAAS,GACjC,kBAAkB;IA2BrB,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,kBAAkB;IAoFlE,iCAAiC,IAAI,kBAAkB;IASjD,qBAAqB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CA6ClE"}
|
|
@@ -19,7 +19,8 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
|
19
19
|
this.marginfiAccountSeedIdx = BigInt(0);
|
|
20
20
|
}
|
|
21
21
|
async initialize(args) {
|
|
22
|
-
await super.initialize(args
|
|
22
|
+
await super.initialize(args);
|
|
23
|
+
this.lendingPlatform = generated_1.LendingPlatform.Marginfi;
|
|
23
24
|
if (this.selfManaged) {
|
|
24
25
|
this.marginfiAccount =
|
|
25
26
|
args.marginfiAccount ??
|
|
@@ -135,12 +136,12 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
|
135
136
|
return (0, generated_1.marginfiOpenPosition)(this.umi, {
|
|
136
137
|
signer: this.signer,
|
|
137
138
|
marginfiProgram: (0, umi_1.publicKey)(marginfi_sdk_1.MARGINFI_PROGRAM_ID),
|
|
138
|
-
signerReferralState: (0, umi_1.publicKey)(this.
|
|
139
|
-
referredByState: this.
|
|
140
|
-
? (0, umi_1.publicKey)(this.
|
|
139
|
+
signerReferralState: (0, umi_1.publicKey)(this.referralState),
|
|
140
|
+
referredByState: this.referredByState
|
|
141
|
+
? (0, umi_1.publicKey)(this.referredByState)
|
|
141
142
|
: undefined,
|
|
142
|
-
referredBySupplyTa: this.referredBySupplyTa
|
|
143
|
-
? (0, umi_1.publicKey)(this.referredBySupplyTa)
|
|
143
|
+
referredBySupplyTa: this.referredBySupplyTa()
|
|
144
|
+
? (0, umi_1.publicKey)(this.referredBySupplyTa())
|
|
144
145
|
: undefined,
|
|
145
146
|
solautoPosition: (0, umi_1.publicKey)(this.solautoPosition),
|
|
146
147
|
marginfiGroup: (0, umi_1.publicKey)(this.marginfiGroup),
|
|
@@ -299,9 +300,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
|
299
300
|
marginfiProgram: (0, umi_1.publicKey)(marginfi_sdk_1.MARGINFI_PROGRAM_ID),
|
|
300
301
|
ixsSysvar: (0, umi_1.publicKey)(web3_js_1.SYSVAR_INSTRUCTIONS_PUBKEY),
|
|
301
302
|
solautoFeesSupplyTa: rebalanceStep === "B" ? (0, umi_1.publicKey)(this.solautoFeesSupplyTa) : undefined,
|
|
302
|
-
authorityReferralState: (0, umi_1.publicKey)(this.
|
|
303
|
-
referredBySupplyTa: this.referredBySupplyTa
|
|
304
|
-
? (0, umi_1.publicKey)(this.referredBySupplyTa)
|
|
303
|
+
authorityReferralState: (0, umi_1.publicKey)(this.referralState),
|
|
304
|
+
referredBySupplyTa: this.referredBySupplyTa()
|
|
305
|
+
? (0, umi_1.publicKey)(this.referredBySupplyTa())
|
|
305
306
|
: undefined,
|
|
306
307
|
positionAuthority: (0, umi_1.publicKey)(this.authority),
|
|
307
308
|
solautoPosition: (0, umi_1.publicKey)(this.solautoPosition),
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import { Umi } from "@metaplex-foundation/umi";
|
|
2
|
-
import { Connection
|
|
2
|
+
import { Connection } from "@solana/web3.js";
|
|
3
3
|
export declare abstract class TxHandler {
|
|
4
4
|
rpcUrl: string;
|
|
5
5
|
umi: Umi;
|
|
6
6
|
connection: Connection;
|
|
7
|
-
referredBy?: PublicKey;
|
|
8
|
-
referredByState?: PublicKey;
|
|
9
7
|
constructor(rpcUrl: string, localTest?: boolean);
|
|
10
8
|
log(...args: any[]): void;
|
|
11
9
|
abstract defaultLookupTables(): string[];
|
|
12
10
|
abstract resetLiveTxUpdates(success?: boolean): Promise<void>;
|
|
13
|
-
abstract setReferredBy(referredBy?: PublicKey): void;
|
|
14
11
|
}
|
|
15
12
|
//# sourceMappingURL=txHandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txHandler.d.ts","sourceRoot":"","sources":["../../src/clients/txHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"txHandler.d.ts","sourceRoot":"","sources":["../../src/clients/txHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAa,MAAM,iBAAiB,CAAC;AAGxD,8BAAsB,SAAS;IACtB,MAAM,EAAG,MAAM,CAAC;IAChB,GAAG,EAAG,GAAG,CAAC;IACV,UAAU,EAAG,UAAU,CAAC;gBAG7B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,OAAO;IAYrB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzB,QAAQ,CAAC,mBAAmB,IAAI,MAAM,EAAE;IAExC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAInB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAuBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAInB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAuBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAyCzD,OAAO,EAAE,oBAAoB,EAAa,MAAM,YAAY,CAAC;AAO7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAqLjD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAiH7B;AAkLD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,oBA2CzE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAkH5C;AAED,wBAAsB,gCAAgC,CACpD,eAAe,EAAE,oBAAoB,EACrC,YAAY,EAAE,SAAS,EACvB,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAsC5C;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG;;;;EAwC9D"}
|
|
@@ -51,14 +51,13 @@ function getWSolUsage(client, solautoActions, initiatingDcaIn, cancellingDcaIn)
|
|
|
51
51
|
}
|
|
52
52
|
async function transactionChoresBefore(client, accountsGettingCreated, solautoActions, initiatingDcaIn) {
|
|
53
53
|
let chores = (0, umi_1.transactionBuilder)();
|
|
54
|
-
if (client.
|
|
55
|
-
(client.
|
|
56
|
-
client.
|
|
54
|
+
if (client.referralStateData === null ||
|
|
55
|
+
(client.referredBy !== undefined &&
|
|
56
|
+
client.referralStateData?.referredByState ===
|
|
57
57
|
(0, umi_1.publicKey)(web3_js_1.PublicKey.default)) ||
|
|
58
58
|
(client.authorityLutAddress !== undefined &&
|
|
59
|
-
client.
|
|
60
|
-
|
|
61
|
-
chores = chores.add(client.referralStateManager.updateReferralStatesIx(undefined, client.authorityLutAddress));
|
|
59
|
+
client.referralStateData.lookupTable == (0, umi_1.publicKey)(web3_js_1.PublicKey.default))) {
|
|
60
|
+
chores = chores.add(client.updateReferralStatesIx(undefined, client.authorityLutAddress));
|
|
62
61
|
}
|
|
63
62
|
if (client.selfManaged) {
|
|
64
63
|
if (client.solautoPositionData === null) {
|
|
@@ -127,14 +126,16 @@ async function rebalanceChoresBefore(client, tx, accountsGettingCreated) {
|
|
|
127
126
|
const usesAccount = (key) => tx
|
|
128
127
|
.getInstructions()
|
|
129
128
|
.some((t) => t.keys.some((k) => (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(k.pubkey).equals(key)));
|
|
130
|
-
const checkReferralSupplyTa = client.referredBySupplyTa && usesAccount(client.referredBySupplyTa);
|
|
129
|
+
const checkReferralSupplyTa = client.referredBySupplyTa() && usesAccount(client.referredBySupplyTa());
|
|
131
130
|
const checkSolautoFeesTa = usesAccount(client.solautoFeesSupplyTa);
|
|
132
131
|
const checkIntermediaryMfiAccount = client.lendingPlatform === generated_1.LendingPlatform.Marginfi &&
|
|
133
132
|
usesAccount(client.intermediaryMarginfiAccountPk);
|
|
134
133
|
const checkSignerSupplyTa = usesAccount(client.signerSupplyTa);
|
|
135
134
|
const checkSignerDebtTa = usesAccount(client.signerDebtTa);
|
|
136
135
|
const accountsNeeded = [
|
|
137
|
-
...[
|
|
136
|
+
...[
|
|
137
|
+
checkReferralSupplyTa ? client.referredBySupplyTa() : web3_js_1.PublicKey.default,
|
|
138
|
+
],
|
|
138
139
|
...[checkSolautoFeesTa ? client.solautoFeesSupplyTa : web3_js_1.PublicKey.default],
|
|
139
140
|
...[
|
|
140
141
|
checkIntermediaryMfiAccount
|
|
@@ -148,7 +149,7 @@ async function rebalanceChoresBefore(client, tx, accountsGettingCreated) {
|
|
|
148
149
|
let chores = (0, umi_1.transactionBuilder)();
|
|
149
150
|
if (checkReferralSupplyTa && !(0, generalUtils_1.rpcAccountCreated)(referredBySupplyTa)) {
|
|
150
151
|
client.log("Creating referred-by TA for ", client.supplyMint.toString());
|
|
151
|
-
chores = chores.add((0, solanaUtils_1.createAssociatedTokenAccountUmiIx)(client.signer, client.
|
|
152
|
+
chores = chores.add((0, solanaUtils_1.createAssociatedTokenAccountUmiIx)(client.signer, client.referredByState, client.supplyMint));
|
|
152
153
|
}
|
|
153
154
|
if (checkSolautoFeesTa && !(0, generalUtils_1.rpcAccountCreated)(solautoFeesSupplyTa)) {
|
|
154
155
|
client.log("Creating Solauto fees TA for ", client.supplyMint.toString());
|
|
@@ -338,13 +339,16 @@ async function requiresRefreshBeforeRebalance(client) {
|
|
|
338
339
|
const oldStateWithLatestPrices = await (0, generalUtils_2.positionStateWithLatestPrices)(client.solautoPositionData.state, constants_1.PRICES[client.supplyMint.toString()].price, constants_1.PRICES[client.debtMint.toString()].price);
|
|
339
340
|
const utilizationRateDiff = Math.abs((client.solautoPositionState?.liqUtilizationRateBps ?? 0) -
|
|
340
341
|
oldStateWithLatestPrices.liqUtilizationRateBps);
|
|
342
|
+
client.log("Liq utilization rate diff:", utilizationRateDiff);
|
|
341
343
|
if (client.livePositionUpdates.supplyAdjustment === BigInt(0) &&
|
|
342
344
|
client.livePositionUpdates.debtAdjustment === BigInt(0) &&
|
|
343
|
-
utilizationRateDiff >=
|
|
345
|
+
utilizationRateDiff >= 10) {
|
|
346
|
+
client.log("Choosing to refresh before rebalance");
|
|
344
347
|
return true;
|
|
345
348
|
}
|
|
346
349
|
}
|
|
347
350
|
// Rebalance ix will already refresh internally if position is self managed, has automation to update, or position state last updated >= 1 day ago
|
|
351
|
+
client.log("Not refreshing before rebalance");
|
|
348
352
|
return false;
|
|
349
353
|
}
|
|
350
354
|
async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRateBps, attemptNum) {
|
package/package.json
CHANGED
|
@@ -23,10 +23,10 @@ import { getReferralState, getTokenAccount } from "../utils";
|
|
|
23
23
|
import { TxHandler } from "./txHandler";
|
|
24
24
|
import { SOLAUTO_LUT } from "../constants";
|
|
25
25
|
|
|
26
|
-
interface ReferralStateManagerArgs {
|
|
26
|
+
export interface ReferralStateManagerArgs {
|
|
27
27
|
signer?: Signer;
|
|
28
28
|
wallet?: WalletAdapter;
|
|
29
|
-
|
|
29
|
+
authority?: PublicKey;
|
|
30
30
|
referredByAuthority?: PublicKey;
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -34,15 +34,18 @@ export class ReferralStateManager extends TxHandler {
|
|
|
34
34
|
public umi!: Umi;
|
|
35
35
|
public signer!: Signer;
|
|
36
36
|
|
|
37
|
-
public
|
|
37
|
+
public authority!: PublicKey;
|
|
38
38
|
public referralState!: PublicKey;
|
|
39
39
|
public referralStateData!: ReferralState | null;
|
|
40
40
|
|
|
41
|
+
public referredBy?: PublicKey;
|
|
42
|
+
public referredByState?: PublicKey;
|
|
43
|
+
|
|
41
44
|
constructor(
|
|
42
|
-
|
|
45
|
+
rpcUrl: string,
|
|
43
46
|
public localTest?: boolean
|
|
44
47
|
) {
|
|
45
|
-
super(
|
|
48
|
+
super(rpcUrl, localTest);
|
|
46
49
|
this.umi = this.umi.use({
|
|
47
50
|
install(umi) {
|
|
48
51
|
umi.programs.add(createSolautoProgram(), false);
|
|
@@ -59,10 +62,11 @@ export class ReferralStateManager extends TxHandler {
|
|
|
59
62
|
? signerIdentity(args.signer)
|
|
60
63
|
: walletAdapterIdentity(args.wallet!, true)
|
|
61
64
|
);
|
|
62
|
-
|
|
63
65
|
this.signer = this.umi.identity;
|
|
66
|
+
this.authority = args.authority ?? toWeb3JsPublicKey(this.signer.publicKey);
|
|
67
|
+
|
|
64
68
|
this.referralState = getReferralState(
|
|
65
|
-
args.
|
|
69
|
+
args.authority ?? toWeb3JsPublicKey(this.signer.publicKey)
|
|
66
70
|
);
|
|
67
71
|
this.referralStateData = await safeFetchReferralState(
|
|
68
72
|
this.umi,
|
|
@@ -82,12 +86,10 @@ export class ReferralStateManager extends TxHandler {
|
|
|
82
86
|
: [SOLAUTO_LUT];
|
|
83
87
|
}
|
|
84
88
|
|
|
85
|
-
|
|
86
|
-
const authorityReferralStateData = this.referralStateData;
|
|
89
|
+
setReferredBy(referredBy?: PublicKey) {
|
|
87
90
|
const hasReferredBy =
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
publicKey(PublicKey.default);
|
|
91
|
+
this.referralStateData &&
|
|
92
|
+
this.referralStateData.referredByState !== publicKey(PublicKey.default);
|
|
91
93
|
const finalReferredBy =
|
|
92
94
|
!hasReferredBy &&
|
|
93
95
|
referredBy &&
|
|
@@ -98,8 +100,8 @@ export class ReferralStateManager extends TxHandler {
|
|
|
98
100
|
this.referredBy = finalReferredBy;
|
|
99
101
|
this.referredByState = finalReferredBy
|
|
100
102
|
? getReferralState(finalReferredBy)
|
|
101
|
-
:
|
|
102
|
-
? toWeb3JsPublicKey(
|
|
103
|
+
: this.referralStateData
|
|
104
|
+
? toWeb3JsPublicKey(this.referralStateData.referredByState)
|
|
103
105
|
: undefined;
|
|
104
106
|
}
|
|
105
107
|
|
|
@@ -143,7 +145,7 @@ export class ReferralStateManager extends TxHandler {
|
|
|
143
145
|
signerWsolTa: publicKey(
|
|
144
146
|
getTokenAccount(toWeb3JsPublicKey(this.signer.publicKey), NATIVE_MINT)
|
|
145
147
|
),
|
|
146
|
-
referralAuthority: publicKey(this.
|
|
148
|
+
referralAuthority: publicKey(this.authority),
|
|
147
149
|
referralState: publicKey(this.referralState),
|
|
148
150
|
referralFeesDestTa: publicKey(referralDestTa),
|
|
149
151
|
referralFeesDestMint: publicKey(referralFeesDestMint),
|
|
@@ -8,13 +8,8 @@ import {
|
|
|
8
8
|
PublicKey as UmiPublicKey,
|
|
9
9
|
isSome,
|
|
10
10
|
transactionBuilder,
|
|
11
|
-
signerIdentity,
|
|
12
11
|
} from "@metaplex-foundation/umi";
|
|
13
12
|
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
|
14
|
-
import {
|
|
15
|
-
WalletAdapter,
|
|
16
|
-
walletAdapterIdentity,
|
|
17
|
-
} from "@metaplex-foundation/umi-signer-wallet-adapters";
|
|
18
13
|
import {
|
|
19
14
|
DCASettings,
|
|
20
15
|
DCASettingsInpArgs,
|
|
@@ -29,12 +24,10 @@ import {
|
|
|
29
24
|
UpdatePositionDataArgs,
|
|
30
25
|
cancelDCA,
|
|
31
26
|
closePosition,
|
|
32
|
-
createSolautoProgram,
|
|
33
27
|
safeFetchSolautoPosition,
|
|
34
28
|
updatePosition,
|
|
35
29
|
} from "../generated";
|
|
36
30
|
import {
|
|
37
|
-
getReferralState,
|
|
38
31
|
getSolautoPositionAccount,
|
|
39
32
|
getTokenAccount,
|
|
40
33
|
} from "../utils/accountUtils";
|
|
@@ -50,25 +43,21 @@ import {
|
|
|
50
43
|
} from "../constants/solautoConstants";
|
|
51
44
|
import { currentUnixSeconds } from "../utils/generalUtils";
|
|
52
45
|
import { LivePositionUpdates } from "../utils/solauto/generalUtils";
|
|
53
|
-
import {
|
|
54
|
-
|
|
46
|
+
import {
|
|
47
|
+
ReferralStateManager,
|
|
48
|
+
ReferralStateManagerArgs,
|
|
49
|
+
} from "./referralStateManager";
|
|
55
50
|
import { QuoteResponse } from "@jup-ag/api";
|
|
56
51
|
|
|
57
|
-
export interface SolautoClientArgs {
|
|
52
|
+
export interface SolautoClientArgs extends ReferralStateManagerArgs {
|
|
58
53
|
new?: boolean;
|
|
59
|
-
authority?: PublicKey;
|
|
60
54
|
positionId?: number;
|
|
61
|
-
signer?: Signer;
|
|
62
|
-
wallet?: WalletAdapter;
|
|
63
|
-
|
|
64
55
|
supplyMint?: PublicKey;
|
|
65
56
|
debtMint?: PublicKey;
|
|
66
|
-
|
|
67
|
-
referredByAuthority?: PublicKey;
|
|
68
57
|
}
|
|
69
58
|
|
|
70
|
-
export abstract class SolautoClient extends
|
|
71
|
-
public lendingPlatform
|
|
59
|
+
export abstract class SolautoClient extends ReferralStateManager {
|
|
60
|
+
public lendingPlatform?: LendingPlatform;
|
|
72
61
|
|
|
73
62
|
public authority!: PublicKey;
|
|
74
63
|
public signer!: Signer;
|
|
@@ -90,9 +79,6 @@ export abstract class SolautoClient extends TxHandler {
|
|
|
90
79
|
public positionDebtTa!: PublicKey;
|
|
91
80
|
public signerDebtTa!: PublicKey;
|
|
92
81
|
|
|
93
|
-
public referralStateManager!: ReferralStateManager;
|
|
94
|
-
public referredBySupplyTa?: PublicKey;
|
|
95
|
-
|
|
96
82
|
public solautoFeesWallet!: PublicKey;
|
|
97
83
|
public solautoFeesSupplyTa!: PublicKey;
|
|
98
84
|
|
|
@@ -100,32 +86,11 @@ export abstract class SolautoClient extends TxHandler {
|
|
|
100
86
|
|
|
101
87
|
public livePositionUpdates: LivePositionUpdates = new LivePositionUpdates();
|
|
102
88
|
|
|
103
|
-
|
|
104
|
-
super(
|
|
105
|
-
|
|
106
|
-
this.umi = this.umi.use({
|
|
107
|
-
install(umi) {
|
|
108
|
-
umi.programs.add(createSolautoProgram(), false);
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async initialize(args: SolautoClientArgs, lendingPlatform: LendingPlatform) {
|
|
114
|
-
if (!args.signer && !args.wallet) {
|
|
115
|
-
throw new Error("Signer or wallet must be provided");
|
|
116
|
-
}
|
|
117
|
-
this.umi = this.umi.use(
|
|
118
|
-
args.signer
|
|
119
|
-
? signerIdentity(args.signer)
|
|
120
|
-
: walletAdapterIdentity(args.wallet!, true)
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
this.signer = this.umi.identity;
|
|
124
|
-
this.authority = args.authority ?? toWeb3JsPublicKey(this.signer.publicKey);
|
|
89
|
+
async initialize(args: SolautoClientArgs) {
|
|
90
|
+
await super.initialize(args);
|
|
125
91
|
|
|
126
92
|
this.positionId = args.positionId ?? 0;
|
|
127
93
|
this.selfManaged = this.positionId === 0;
|
|
128
|
-
this.lendingPlatform = lendingPlatform;
|
|
129
94
|
this.solautoPosition = getSolautoPositionAccount(
|
|
130
95
|
this.authority,
|
|
131
96
|
this.positionId
|
|
@@ -167,35 +132,18 @@ export abstract class SolautoClient extends TxHandler {
|
|
|
167
132
|
this.debtMint
|
|
168
133
|
);
|
|
169
134
|
|
|
170
|
-
this.referralStateManager = new ReferralStateManager(this.rpcUrl);
|
|
171
|
-
await this.referralStateManager.initialize({
|
|
172
|
-
referralAuthority: this.authority,
|
|
173
|
-
referredByAuthority: args.referredByAuthority,
|
|
174
|
-
signer: args.signer,
|
|
175
|
-
wallet: args.wallet,
|
|
176
|
-
});
|
|
177
|
-
console.log(this.referralStateManager.referredBy?.toString());
|
|
178
|
-
if (this.referralStateManager.referredByState !== undefined) {
|
|
179
|
-
this.referredBySupplyTa = getTokenAccount(
|
|
180
|
-
this.referralStateManager.referredByState,
|
|
181
|
-
this.supplyMint
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
135
|
this.solautoFeesWallet = SOLAUTO_FEES_WALLET;
|
|
186
136
|
this.solautoFeesSupplyTa = getTokenAccount(
|
|
187
137
|
this.solautoFeesWallet,
|
|
188
138
|
this.supplyMint
|
|
189
139
|
);
|
|
190
140
|
|
|
191
|
-
const authorityReferralStateData =
|
|
192
|
-
this.referralStateManager.referralStateData;
|
|
193
141
|
this.authorityLutAddress =
|
|
194
|
-
|
|
195
|
-
!toWeb3JsPublicKey(
|
|
142
|
+
this.referralStateData?.lookupTable &&
|
|
143
|
+
!toWeb3JsPublicKey(this.referralStateData.lookupTable).equals(
|
|
196
144
|
PublicKey.default
|
|
197
145
|
)
|
|
198
|
-
? toWeb3JsPublicKey(
|
|
146
|
+
? toWeb3JsPublicKey(this.referralStateData.lookupTable)
|
|
199
147
|
: undefined;
|
|
200
148
|
|
|
201
149
|
this.log("Position state: ", this.solautoPositionState);
|
|
@@ -212,14 +160,11 @@ export abstract class SolautoClient extends TxHandler {
|
|
|
212
160
|
);
|
|
213
161
|
}
|
|
214
162
|
|
|
215
|
-
|
|
216
|
-
this.
|
|
217
|
-
|
|
218
|
-
this.referredBySupplyTa = getTokenAccount(
|
|
219
|
-
this.referralStateManager.referredByState!,
|
|
220
|
-
this.supplyMint
|
|
221
|
-
);
|
|
163
|
+
referredBySupplyTa(): PublicKey | undefined {
|
|
164
|
+
if (this.referredByState !== undefined) {
|
|
165
|
+
return getTokenAccount(this.referredByState, this.supplyMint);
|
|
222
166
|
}
|
|
167
|
+
return undefined;
|
|
223
168
|
}
|
|
224
169
|
|
|
225
170
|
async resetLiveTxUpdates(success?: boolean) {
|
|
@@ -268,8 +213,8 @@ export abstract class SolautoClient extends TxHandler {
|
|
|
268
213
|
this.solautoPosition,
|
|
269
214
|
this.positionSupplyTa,
|
|
270
215
|
this.positionDebtTa,
|
|
271
|
-
this.
|
|
272
|
-
...(this.referredBySupplyTa ? [this.referredBySupplyTa] : []),
|
|
216
|
+
this.referralState,
|
|
217
|
+
...(this.referredBySupplyTa() ? [this.referredBySupplyTa()!] : []),
|
|
273
218
|
];
|
|
274
219
|
}
|
|
275
220
|
|
|
@@ -333,7 +278,7 @@ export abstract class SolautoClient extends TxHandler {
|
|
|
333
278
|
const addingReferredBy =
|
|
334
279
|
accountsToAdd.length === 1 &&
|
|
335
280
|
accountsToAdd[0].toString().toLowerCase() ===
|
|
336
|
-
this.referredBySupplyTa?.toString().toLowerCase();
|
|
281
|
+
this.referredBySupplyTa()?.toString().toLowerCase();
|
|
337
282
|
|
|
338
283
|
if (tx.getInstructions().length > 0) {
|
|
339
284
|
this.log("Updating authority lookup table...");
|
|
@@ -85,7 +85,9 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
85
85
|
public intermediaryMarginfiAccount?: MarginfiAccount;
|
|
86
86
|
|
|
87
87
|
async initialize(args: SolautoMarginfiClientArgs) {
|
|
88
|
-
await super.initialize(args
|
|
88
|
+
await super.initialize(args);
|
|
89
|
+
|
|
90
|
+
this.lendingPlatform = LendingPlatform.Marginfi;
|
|
89
91
|
|
|
90
92
|
if (this.selfManaged) {
|
|
91
93
|
this.marginfiAccount =
|
|
@@ -262,12 +264,12 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
262
264
|
return marginfiOpenPosition(this.umi, {
|
|
263
265
|
signer: this.signer,
|
|
264
266
|
marginfiProgram: publicKey(MARGINFI_PROGRAM_ID),
|
|
265
|
-
signerReferralState: publicKey(this.
|
|
266
|
-
referredByState: this.
|
|
267
|
-
? publicKey(this.
|
|
267
|
+
signerReferralState: publicKey(this.referralState),
|
|
268
|
+
referredByState: this.referredByState
|
|
269
|
+
? publicKey(this.referredByState)
|
|
268
270
|
: undefined,
|
|
269
|
-
referredBySupplyTa: this.referredBySupplyTa
|
|
270
|
-
? publicKey(this.referredBySupplyTa)
|
|
271
|
+
referredBySupplyTa: this.referredBySupplyTa()
|
|
272
|
+
? publicKey(this.referredBySupplyTa()!)
|
|
271
273
|
: undefined,
|
|
272
274
|
solautoPosition: publicKey(this.solautoPosition),
|
|
273
275
|
marginfiGroup: publicKey(this.marginfiGroup),
|
|
@@ -472,10 +474,10 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
472
474
|
solautoFeesSupplyTa:
|
|
473
475
|
rebalanceStep === "B" ? publicKey(this.solautoFeesSupplyTa) : undefined,
|
|
474
476
|
authorityReferralState: publicKey(
|
|
475
|
-
this.
|
|
477
|
+
this.referralState
|
|
476
478
|
),
|
|
477
|
-
referredBySupplyTa: this.referredBySupplyTa
|
|
478
|
-
? publicKey(this.referredBySupplyTa)
|
|
479
|
+
referredBySupplyTa: this.referredBySupplyTa()
|
|
480
|
+
? publicKey(this.referredBySupplyTa()!)
|
|
479
481
|
: undefined,
|
|
480
482
|
positionAuthority: publicKey(this.authority),
|
|
481
483
|
solautoPosition: publicKey(this.solautoPosition),
|
package/src/clients/txHandler.ts
CHANGED
|
@@ -7,9 +7,6 @@ export abstract class TxHandler {
|
|
|
7
7
|
public umi!: Umi;
|
|
8
8
|
public connection!: Connection;
|
|
9
9
|
|
|
10
|
-
public referredBy?: PublicKey;
|
|
11
|
-
public referredByState?: PublicKey;
|
|
12
|
-
|
|
13
10
|
constructor(
|
|
14
11
|
rpcUrl: string,
|
|
15
12
|
localTest?: boolean
|
|
@@ -31,6 +28,4 @@ export abstract class TxHandler {
|
|
|
31
28
|
abstract defaultLookupTables(): string[];
|
|
32
29
|
|
|
33
30
|
abstract resetLiveTxUpdates(success?: boolean): Promise<void>;
|
|
34
|
-
|
|
35
|
-
abstract setReferredBy(referredBy?: PublicKey): void;
|
|
36
31
|
}
|
|
@@ -57,7 +57,11 @@ import {
|
|
|
57
57
|
eligibleForRebalance,
|
|
58
58
|
positionStateWithLatestPrices,
|
|
59
59
|
} from "../utils/solauto/generalUtils";
|
|
60
|
-
import {
|
|
60
|
+
import {
|
|
61
|
+
getReferralState,
|
|
62
|
+
getTokenAccount,
|
|
63
|
+
getTokenAccountData,
|
|
64
|
+
} from "../utils/accountUtils";
|
|
61
65
|
import {
|
|
62
66
|
createMarginfiProgram,
|
|
63
67
|
getLendingAccountBorrowInstructionDataSerializer,
|
|
@@ -139,19 +143,15 @@ async function transactionChoresBefore(
|
|
|
139
143
|
let chores = transactionBuilder();
|
|
140
144
|
|
|
141
145
|
if (
|
|
142
|
-
client.
|
|
143
|
-
(client.
|
|
144
|
-
client.
|
|
146
|
+
client.referralStateData === null ||
|
|
147
|
+
(client.referredBy !== undefined &&
|
|
148
|
+
client.referralStateData?.referredByState ===
|
|
145
149
|
publicKey(PublicKey.default)) ||
|
|
146
150
|
(client.authorityLutAddress !== undefined &&
|
|
147
|
-
client.
|
|
148
|
-
publicKey(PublicKey.default))
|
|
151
|
+
client.referralStateData!.lookupTable == publicKey(PublicKey.default))
|
|
149
152
|
) {
|
|
150
153
|
chores = chores.add(
|
|
151
|
-
client.
|
|
152
|
-
undefined,
|
|
153
|
-
client.authorityLutAddress
|
|
154
|
-
)
|
|
154
|
+
client.updateReferralStatesIx(undefined, client.authorityLutAddress)
|
|
155
155
|
);
|
|
156
156
|
}
|
|
157
157
|
|
|
@@ -275,7 +275,7 @@ export async function rebalanceChoresBefore(
|
|
|
275
275
|
.some((t) => t.keys.some((k) => toWeb3JsPublicKey(k.pubkey).equals(key)));
|
|
276
276
|
|
|
277
277
|
const checkReferralSupplyTa =
|
|
278
|
-
client.referredBySupplyTa && usesAccount(client.referredBySupplyTa);
|
|
278
|
+
client.referredBySupplyTa() && usesAccount(client.referredBySupplyTa()!);
|
|
279
279
|
const checkSolautoFeesTa = usesAccount(client.solautoFeesSupplyTa);
|
|
280
280
|
const checkIntermediaryMfiAccount =
|
|
281
281
|
client.lendingPlatform === LendingPlatform.Marginfi &&
|
|
@@ -286,7 +286,9 @@ export async function rebalanceChoresBefore(
|
|
|
286
286
|
const checkSignerDebtTa = usesAccount(client.signerDebtTa);
|
|
287
287
|
|
|
288
288
|
const accountsNeeded = [
|
|
289
|
-
...[
|
|
289
|
+
...[
|
|
290
|
+
checkReferralSupplyTa ? client.referredBySupplyTa() : PublicKey.default,
|
|
291
|
+
],
|
|
290
292
|
...[checkSolautoFeesTa ? client.solautoFeesSupplyTa : PublicKey.default],
|
|
291
293
|
...[
|
|
292
294
|
checkIntermediaryMfiAccount
|
|
@@ -314,7 +316,7 @@ export async function rebalanceChoresBefore(
|
|
|
314
316
|
chores = chores.add(
|
|
315
317
|
createAssociatedTokenAccountUmiIx(
|
|
316
318
|
client.signer,
|
|
317
|
-
client.
|
|
319
|
+
client.referredByState!,
|
|
318
320
|
client.supplyMint
|
|
319
321
|
)
|
|
320
322
|
);
|
|
@@ -611,17 +613,20 @@ export async function requiresRefreshBeforeRebalance(client: SolautoClient) {
|
|
|
611
613
|
oldStateWithLatestPrices.liqUtilizationRateBps
|
|
612
614
|
);
|
|
613
615
|
|
|
616
|
+
client.log("Liq utilization rate diff:", utilizationRateDiff);
|
|
614
617
|
if (
|
|
615
618
|
client.livePositionUpdates.supplyAdjustment === BigInt(0) &&
|
|
616
619
|
client.livePositionUpdates.debtAdjustment === BigInt(0) &&
|
|
617
|
-
utilizationRateDiff >=
|
|
620
|
+
utilizationRateDiff >= 10
|
|
618
621
|
) {
|
|
622
|
+
client.log("Choosing to refresh before rebalance");
|
|
619
623
|
return true;
|
|
620
624
|
}
|
|
621
625
|
}
|
|
622
626
|
|
|
623
627
|
// Rebalance ix will already refresh internally if position is self managed, has automation to update, or position state last updated >= 1 day ago
|
|
624
628
|
|
|
629
|
+
client.log("Not refreshing before rebalance");
|
|
625
630
|
return false;
|
|
626
631
|
}
|
|
627
632
|
|
|
@@ -25,10 +25,10 @@ import { buildHeliusApiUrl } from "../../src/utils";
|
|
|
25
25
|
import { PriorityFeeSetting } from "../../src/types";
|
|
26
26
|
|
|
27
27
|
describe("Solauto Marginfi tests", async () => {
|
|
28
|
-
const signer = setupTest();
|
|
29
|
-
|
|
28
|
+
// const signer = setupTest();
|
|
29
|
+
const signer = setupTest("solauto-manager");
|
|
30
30
|
|
|
31
|
-
const payForTransactions =
|
|
31
|
+
const payForTransactions = false;
|
|
32
32
|
const useJitoBundle = false;
|
|
33
33
|
const positionId = 1;
|
|
34
34
|
|
|
@@ -128,7 +128,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
|
128
128
|
transactionItems.push(
|
|
129
129
|
new TransactionItem(
|
|
130
130
|
async (attemptNum) =>
|
|
131
|
-
await buildSolautoRebalanceTransaction(client,
|
|
131
|
+
await buildSolautoRebalanceTransaction(client, undefined, attemptNum),
|
|
132
132
|
"rebalance"
|
|
133
133
|
)
|
|
134
134
|
);
|