@haven-fi/solauto-sdk 1.0.231 → 1.0.233
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/solautoMarginfiClient.d.ts.map +1 -1
- package/dist/clients/solautoMarginfiClient.js +4 -5
- package/dist/transactions/transactionUtils.d.ts +1 -1
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +14 -3
- package/dist/transactions/transactionsManager.d.ts +2 -1
- package/dist/transactions/transactionsManager.d.ts.map +1 -1
- package/dist/transactions/transactionsManager.js +6 -4
- package/dist/utils/accountUtils.d.ts +1 -1
- package/dist/utils/accountUtils.d.ts.map +1 -1
- package/dist/utils/accountUtils.js +2 -2
- package/dist/utils/numberUtils.js +1 -1
- package/dist/utils/solanaUtils.d.ts +1 -1
- package/dist/utils/solanaUtils.d.ts.map +1 -1
- package/dist/utils/solanaUtils.js +74 -15
- package/package.json +1 -1
- package/src/clients/solautoMarginfiClient.ts +7 -6
- package/src/transactions/transactionUtils.ts +16 -4
- package/src/transactions/transactionsManager.ts +11 -9
- package/src/utils/accountUtils.ts +2 -2
- package/src/utils/numberUtils.ts +1 -1
- package/src/utils/solanaUtils.ts +107 -26
- package/tests/transactions/solautoMarginfi.ts +1 -2
|
@@ -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,EAGb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAOtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAQzC,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;IAgE1C,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,eAAe,EAAE,eAAe,EAChC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,GACnC,kBAAkB;IAgFrB,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;
|
|
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,EAGb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAOtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAQzC,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;IAgE1C,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,eAAe,EAAE,eAAe,EAChC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,GACnC,kBAAkB;IAgFrB,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;CA8ClE"}
|
|
@@ -442,11 +442,10 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
|
|
|
442
442
|
if (state) {
|
|
443
443
|
return state;
|
|
444
444
|
}
|
|
445
|
-
const
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
: undefined, this.livePositionUpdates);
|
|
445
|
+
const useDesignatedMint = !this.selfManaged &&
|
|
446
|
+
(this.solautoPositionData === null ||
|
|
447
|
+
!(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey).equals(this.authority));
|
|
448
|
+
const freshState = await (0, marginfiUtils_1.getMarginfiAccountPositionState)(this.umi, { pk: this.marginfiAccountPk }, this.marginfiGroup, useDesignatedMint ? { mint: this.supplyMint } : undefined, useDesignatedMint ? { mint: this.debtMint } : undefined, this.livePositionUpdates);
|
|
450
449
|
if (freshState) {
|
|
451
450
|
this.log("Fresh state", freshState);
|
|
452
451
|
const supplyPrice = (0, generalUtils_1.safeGetPrice)(freshState?.supply.mint);
|
|
@@ -10,7 +10,7 @@ export declare function buildSolautoRebalanceTransaction(client: SolautoClient,
|
|
|
10
10
|
export declare function convertReferralFeesToDestination(referralManager: ReferralStateManager, tokenAccount: PublicKey, destinationMint: PublicKey): Promise<TransactionItemInputs | undefined>;
|
|
11
11
|
export declare function getErrorInfo(umi: Umi, tx: TransactionBuilder, error: any): {
|
|
12
12
|
errorName: string | undefined;
|
|
13
|
-
errorInfo: undefined;
|
|
13
|
+
errorInfo: string | undefined;
|
|
14
14
|
canBeIgnored: boolean;
|
|
15
15
|
};
|
|
16
16
|
//# sourceMappingURL=transactionUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAmBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAwCzD,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,CAkH7B;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,CAsH5C;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,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG;;;;
|
|
1
|
+
{"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAmBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAwCzD,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,CAkH7B;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,CAsH5C;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,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG;;;;EAoDxE"}
|
|
@@ -438,23 +438,34 @@ function getErrorInfo(umi, tx, error) {
|
|
|
438
438
|
if (typeof error === "object" && error["InstructionError"]) {
|
|
439
439
|
const err = error["InstructionError"];
|
|
440
440
|
const errIx = tx.getInstructions()[Math.max(0, err[0] - 2)];
|
|
441
|
-
const errCode = err[1]["Custom"];
|
|
441
|
+
const errCode = typeof err[1] === "object" ? err[1]["Custom"] : undefined;
|
|
442
|
+
const errName = errCode === undefined ? err[1] : undefined;
|
|
443
|
+
let programName = "";
|
|
442
444
|
if (errIx.programId.toString() === umi.programs.get("solauto").publicKey.toString()) {
|
|
443
445
|
programError = (0, generated_1.getSolautoErrorFromCode)(errCode, (0, generated_1.createSolautoProgram)());
|
|
446
|
+
programName = "Haven";
|
|
444
447
|
if (programError?.name ===
|
|
445
448
|
new generated_1.InvalidRebalanceConditionError((0, generated_1.createSolautoProgram)()).name) {
|
|
446
449
|
canBeIgnored = true;
|
|
447
450
|
}
|
|
448
451
|
}
|
|
449
452
|
else if (errIx.programId === marginfi_sdk_1.MARGINFI_PROGRAM_ID) {
|
|
453
|
+
programName = "Marginfi";
|
|
450
454
|
programError = (0, marginfi_sdk_1.getMarginfiErrorFromName)(errCode, (0, marginfi_sdk_1.createMarginfiProgram)());
|
|
451
455
|
}
|
|
452
456
|
else if (errIx.programId === jupiter_sdk_1.JUPITER_PROGRAM_ID) {
|
|
457
|
+
programName = "Jupiter";
|
|
453
458
|
programError = (0, jupiter_sdk_1.getJupiterErrorFromName)(errCode, (0, jupiter_sdk_1.createJupiterProgram)());
|
|
454
459
|
}
|
|
460
|
+
if (errName && errCode === undefined) {
|
|
461
|
+
errorName = `${programName ?? "Program"} error`;
|
|
462
|
+
errorInfo = errName;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
if (programError) {
|
|
466
|
+
errorName = programError?.name;
|
|
467
|
+
errorInfo = programError?.message;
|
|
455
468
|
}
|
|
456
|
-
errorName = programError?.name;
|
|
457
|
-
errorName = programError?.message;
|
|
458
469
|
}
|
|
459
470
|
catch { }
|
|
460
471
|
return {
|
|
@@ -36,9 +36,10 @@ export declare class TransactionsManager {
|
|
|
36
36
|
private errorsToThrow?;
|
|
37
37
|
private retries;
|
|
38
38
|
private retryDelay;
|
|
39
|
+
private confirmTimeout;
|
|
39
40
|
private statuses;
|
|
40
41
|
private lookupTables;
|
|
41
|
-
constructor(txHandler: SolautoClient | ReferralStateManager, statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, txType?: TransactionRunType | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined, retries?: number, retryDelay?: number);
|
|
42
|
+
constructor(txHandler: SolautoClient | ReferralStateManager, statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, txType?: TransactionRunType | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined, retries?: number, retryDelay?: number, confirmTimeout?: number);
|
|
42
43
|
private assembleTransactionSets;
|
|
43
44
|
private updateStatus;
|
|
44
45
|
private debugAccounts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,
|
|
1
|
+
{"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAa,MAAM,YAAY,CAAC;AAsC7D,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IAPtB,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA;IAGhB,UAAU;IAIV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAgFD,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc;IAXxB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,SAAS,EAAE,aAAa,GAAG,oBAAoB,EAC/C,cAAc,CAAC,GAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,aAAA,EAC/D,MAAM,CAAC,EAAE,kBAAkB,YAAA,EAC3B,YAAY,CAAC,EAAE,OAAO,YAAA,EACtB,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,OAAO,GAAE,MAAU,EACnB,UAAU,GAAE,MAAY,EACxB,cAAc,GAAE,MAAc;YAQ1B,uBAAuB;IAwCrC,OAAO,CAAC,YAAY;YA8CN,aAAa;IAoBd,UAAU,CACrB,YAAY,EAAE,eAAe,EAAE,EAC/B,eAAe,CAAC,EAAE,kBAAkB,GACnC,OAAO,CAAC,0BAA0B,CAAC;IAyEzB,IAAI,CACf,KAAK,EAAE,eAAe,EAAE,EACxB,eAAe,CAAC,EAAE,kBAAkB,EACpC,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,0BAA0B,CAAC;YAwGxB,eAAe;CAmD9B"}
|
|
@@ -119,7 +119,7 @@ var TransactionStatus;
|
|
|
119
119
|
TransactionStatus["Failed"] = "Failed";
|
|
120
120
|
})(TransactionStatus || (exports.TransactionStatus = TransactionStatus = {}));
|
|
121
121
|
class TransactionsManager {
|
|
122
|
-
constructor(txHandler, statusCallback, txType, mustBeAtomic, errorsToThrow, retries = 4, retryDelay = 150) {
|
|
122
|
+
constructor(txHandler, statusCallback, txType, mustBeAtomic, errorsToThrow, retries = 4, retryDelay = 150, confirmTimeout = 10000) {
|
|
123
123
|
this.txHandler = txHandler;
|
|
124
124
|
this.statusCallback = statusCallback;
|
|
125
125
|
this.txType = txType;
|
|
@@ -127,6 +127,7 @@ class TransactionsManager {
|
|
|
127
127
|
this.errorsToThrow = errorsToThrow;
|
|
128
128
|
this.retries = retries;
|
|
129
129
|
this.retryDelay = retryDelay;
|
|
130
|
+
this.confirmTimeout = confirmTimeout;
|
|
130
131
|
this.statuses = [];
|
|
131
132
|
this.lookupTables = new LookupTables(this.txHandler.defaultLookupTables(), this.txHandler.umi);
|
|
132
133
|
}
|
|
@@ -330,15 +331,16 @@ class TransactionsManager {
|
|
|
330
331
|
async sendTransaction(tx, txName, attemptNum, prioritySetting) {
|
|
331
332
|
this.updateStatus(txName, TransactionStatus.Processing, attemptNum);
|
|
332
333
|
try {
|
|
333
|
-
const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, tx, this.txType,
|
|
334
|
+
const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, tx, this.txType, this.confirmTimeout, prioritySetting, () => this.updateStatus(txName, TransactionStatus.Processing, attemptNum, undefined, true));
|
|
334
335
|
this.updateStatus(txName, TransactionStatus.Successful, attemptNum, txSig ? bs58_1.default.encode(txSig) : undefined);
|
|
335
336
|
}
|
|
336
337
|
catch (e) {
|
|
337
338
|
const errorDetails = (0, transactionUtils_1.getErrorInfo)(this.txHandler.umi, tx, e);
|
|
339
|
+
const errorString = `${errorDetails.errorName ?? "Unknown error"}: ${errorDetails.errorInfo ?? "unknown"}`;
|
|
338
340
|
this.updateStatus(txName, errorDetails.canBeIgnored
|
|
339
341
|
? TransactionStatus.Skipped
|
|
340
|
-
: TransactionStatus.Failed, attemptNum, undefined, undefined,
|
|
341
|
-
this.txHandler.log(
|
|
342
|
+
: TransactionStatus.Failed, attemptNum, undefined, undefined, errorString);
|
|
343
|
+
this.txHandler.log(errorString);
|
|
342
344
|
if (!errorDetails.canBeIgnored) {
|
|
343
345
|
throw e;
|
|
344
346
|
}
|
|
@@ -5,7 +5,7 @@ export declare function bufferFromU64(num: bigint): Buffer;
|
|
|
5
5
|
export declare function getTokenAccount(wallet: PublicKey, tokenMint: PublicKey): PublicKey;
|
|
6
6
|
export declare function getTokenAccounts(wallet: PublicKey, tokenMints: PublicKey[]): PublicKey[];
|
|
7
7
|
export declare function getTokenAccountData(umi: Umi, tokenAccount: PublicKey): Promise<import("@solana/spl-token").RawAccount | undefined>;
|
|
8
|
-
export declare function getSolautoPositionAccount(
|
|
8
|
+
export declare function getSolautoPositionAccount(authority: PublicKey, positionId: number, programId: PublicKey): PublicKey;
|
|
9
9
|
export declare function getReferralState(authority: PublicKey, programId: PublicKey): PublicKey;
|
|
10
10
|
export declare function getMarginfiAccountPDA(solautoPositionAccount: PublicKey, marginfiAccountSeedIdx: bigint, programId: PublicKey): PublicKey;
|
|
11
11
|
//# sourceMappingURL=accountUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accountUtils.d.ts","sourceRoot":"","sources":["../../src/utils/accountUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,CAMlF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAExF;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,+DAO1E;AAED,wBAAgB,yBAAyB,CACvC,
|
|
1
|
+
{"version":3,"file":"accountUtils.d.ts","sourceRoot":"","sources":["../../src/utils/accountUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,CAMlF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAExF;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,+DAO1E;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,aAQrB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,aAU1E;AAED,wBAAgB,qBAAqB,CACnC,sBAAsB,EAAE,SAAS,EACjC,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,SAAS,aAarB"}
|
|
@@ -36,8 +36,8 @@ async function getTokenAccountData(umi, tokenAccount) {
|
|
|
36
36
|
return undefined;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
function getSolautoPositionAccount(
|
|
40
|
-
const [positionAccount, _] = web3_js_1.PublicKey.findProgramAddressSync([bufferFromU8(positionId),
|
|
39
|
+
function getSolautoPositionAccount(authority, positionId, programId) {
|
|
40
|
+
const [positionAccount, _] = web3_js_1.PublicKey.findProgramAddressSync([bufferFromU8(positionId), authority.toBuffer()], programId);
|
|
41
41
|
return positionAccount;
|
|
42
42
|
}
|
|
43
43
|
function getReferralState(authority, programId) {
|
|
@@ -16,7 +16,7 @@ exports.maxBoostToBps = maxBoostToBps;
|
|
|
16
16
|
const constants_1 = require("../constants");
|
|
17
17
|
const generated_1 = require("../generated");
|
|
18
18
|
function getLiqUtilzationRateBps(supplyUsd, debtUsd, liqThresholdBps) {
|
|
19
|
-
if (supplyUsd === 0) {
|
|
19
|
+
if (supplyUsd === 0 || debtUsd === 0) {
|
|
20
20
|
return 0;
|
|
21
21
|
}
|
|
22
22
|
return toBps(debtUsd / (supplyUsd * fromBps(liqThresholdBps)));
|
|
@@ -14,5 +14,5 @@ export declare function splTokenTransferUmiIx(signer: Signer, fromTa: PublicKey,
|
|
|
14
14
|
export declare function getAddressLookupInputs(umi: Umi, lookupTableAddresses: string[]): Promise<AddressLookupTableInput[]>;
|
|
15
15
|
export declare function assembleFinalTransaction(signer: Signer, tx: TransactionBuilder, computeUnitPrice: number, computeUnitLimit?: number): TransactionBuilder;
|
|
16
16
|
export declare function getComputeUnitPriceEstimate(umi: Umi, tx: TransactionBuilder, prioritySetting: PriorityFeeSetting): Promise<number | undefined>;
|
|
17
|
-
export declare function sendSingleOptimizedTransaction(umi: Umi, connection: Connection, tx: TransactionBuilder, txType?: TransactionRunType,
|
|
17
|
+
export declare function sendSingleOptimizedTransaction(umi: Umi, connection: Connection, tx: TransactionBuilder, txType?: TransactionRunType, confirmTimeout?: number, prioritySetting?: PriorityFeeSetting, onAwaitingSign?: () => void): Promise<Uint8Array | undefined>;
|
|
18
18
|
//# sourceMappingURL=solanaUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,
|
|
1
|
+
{"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAKL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAgBzB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIlE,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,SAAgC,GAC1C,CAAC,UAAU,EAAE,GAAG,CAAC,CAQnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,sBAAsB,GACzB,kBAAkB,CAMpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAOpB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,kBAAkB,CAUpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,MAAM,GACf,kBAAkB,CASpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,SAAS,GACnB,kBAAkB,CAKpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAKpB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAkBpC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,kBAAkB,EACtB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,CAAC,EAAE,MAAM,sBA4D1B;AAmBD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,eAAe,EAAE,kBAAkB,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAqED,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,kBAAkB,EACtB,MAAM,CAAC,EAAE,kBAAkB,EAC3B,cAAc,GAAE,MAAc,EAC9B,eAAe,GAAE,kBAA+C,EAChE,cAAc,CAAC,EAAE,MAAM,IAAI,GAC1B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA0EjC"}
|
|
@@ -164,7 +164,59 @@ async function getComputeUnitPriceEstimate(umi, tx, prioritySetting) {
|
|
|
164
164
|
}
|
|
165
165
|
return feeEstimate;
|
|
166
166
|
}
|
|
167
|
-
async function
|
|
167
|
+
async function spamSendTransactionUntilConfirmed(connection, transaction, blockhash, confirmTimeout = 10000, spamInterval = 1000) {
|
|
168
|
+
let spamAttempts = 0;
|
|
169
|
+
let confirmed = false;
|
|
170
|
+
let transactionSignature = null;
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const spamSend = async () => {
|
|
173
|
+
if (confirmed) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const txSignature = await connection.sendRawTransaction(Buffer.from(transaction.serialize()), { skipPreflight: true, maxRetries: 0 });
|
|
178
|
+
transactionSignature = txSignature;
|
|
179
|
+
(0, generalUtils_1.consoleLog)(`Transaction sent`);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
(0, generalUtils_1.consoleLog)("Error sending transaction:", error);
|
|
183
|
+
}
|
|
184
|
+
spamAttempts++;
|
|
185
|
+
if (!confirmed) {
|
|
186
|
+
setTimeout(spamSend, spamInterval);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
const confirmTransaction = async () => {
|
|
190
|
+
if (transactionSignature) {
|
|
191
|
+
try {
|
|
192
|
+
const { value } = await connection.confirmTransaction({
|
|
193
|
+
...blockhash,
|
|
194
|
+
signature: transactionSignature,
|
|
195
|
+
});
|
|
196
|
+
if (value.err) {
|
|
197
|
+
reject(value.err);
|
|
198
|
+
}
|
|
199
|
+
confirmed = true;
|
|
200
|
+
resolve(transactionSignature);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
(0, generalUtils_1.consoleLog)("Error during confirmation:", error);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (!confirmed) {
|
|
207
|
+
setTimeout(confirmTransaction, 1000);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
spamSend();
|
|
211
|
+
confirmTransaction();
|
|
212
|
+
setTimeout(() => {
|
|
213
|
+
if (!confirmed) {
|
|
214
|
+
reject(new Error("Failed to confirm transaction within timeout"));
|
|
215
|
+
}
|
|
216
|
+
}, confirmTimeout);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
async function sendSingleOptimizedTransaction(umi, connection, tx, txType, confirmTimeout = 10000, prioritySetting = types_1.PriorityFeeSetting.Default, onAwaitingSign) {
|
|
168
220
|
(0, generalUtils_1.consoleLog)("Sending single optimized transaction...");
|
|
169
221
|
(0, generalUtils_1.consoleLog)("Instructions: ", tx.getInstructions().length);
|
|
170
222
|
(0, generalUtils_1.consoleLog)("Serialized transaction size: ", tx.getTransactionSize(umi));
|
|
@@ -177,26 +229,33 @@ async function sendSingleOptimizedTransaction(umi, connection, tx, txType, attem
|
|
|
177
229
|
if (txType !== "skip-simulation") {
|
|
178
230
|
// TODO: we should only retry simulation if it's not a solauto error
|
|
179
231
|
const simulationResult = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await simulateTransaction(connection, (0, umi_web3js_adapters_1.toWeb3JsTransaction)(await (await assembleFinalTransaction(umi.identity, tx, cuPrice, 1400000).setLatestBlockhash(umi)).build(umi))), 3);
|
|
180
|
-
|
|
232
|
+
simulationResult.value.err;
|
|
233
|
+
computeUnitLimit = Math.round(simulationResult.value.unitsConsumed * 1.05);
|
|
181
234
|
(0, generalUtils_1.consoleLog)("Compute unit limit: ", computeUnitLimit);
|
|
182
235
|
}
|
|
183
236
|
if (txType !== "only-simulate") {
|
|
184
237
|
onAwaitingSign?.();
|
|
185
|
-
const result = await assembleFinalTransaction(
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
238
|
+
// const result = await assembleFinalTransaction(
|
|
239
|
+
// umi.identity,
|
|
240
|
+
// tx,
|
|
241
|
+
// cuPrice,
|
|
242
|
+
// computeUnitLimit
|
|
243
|
+
// ).sendAndConfirm(umi, {
|
|
244
|
+
// send: {
|
|
245
|
+
// skipPreflight: true,
|
|
246
|
+
// commitment: "confirmed",
|
|
247
|
+
// maxRetries: 0
|
|
248
|
+
// },
|
|
249
|
+
// confirm: { commitment: "confirmed" },
|
|
250
|
+
// });
|
|
251
|
+
const blockhash = await connection.getLatestBlockhash("confirmed");
|
|
252
|
+
const signedTx = await assembleFinalTransaction(umi.identity, tx, cuPrice, computeUnitLimit)
|
|
253
|
+
.setBlockhash(blockhash)
|
|
254
|
+
.buildAndSign(umi);
|
|
255
|
+
const txSig = await spamSendTransactionUntilConfirmed(connection, (0, umi_web3js_adapters_1.toWeb3JsTransaction)(signedTx), blockhash, confirmTimeout);
|
|
194
256
|
(0, generalUtils_1.consoleLog)(`Transaction signature: ${txSig}`);
|
|
195
257
|
(0, generalUtils_1.consoleLog)(`https://solscan.io/tx/${txSig}`);
|
|
196
|
-
|
|
197
|
-
throw new Error(result.result.value.err.toString());
|
|
198
|
-
}
|
|
199
|
-
return result.signature;
|
|
258
|
+
return bs58_1.default.decode(txSig);
|
|
200
259
|
}
|
|
201
260
|
return undefined;
|
|
202
261
|
}
|
package/package.json
CHANGED
|
@@ -670,16 +670,17 @@ export class SolautoMarginfiClient extends SolautoClient {
|
|
|
670
670
|
return state;
|
|
671
671
|
}
|
|
672
672
|
|
|
673
|
+
const useDesignatedMint =
|
|
674
|
+
!this.selfManaged &&
|
|
675
|
+
(this.solautoPositionData === null ||
|
|
676
|
+
!toWeb3JsPublicKey(this.signer.publicKey).equals(this.authority));
|
|
677
|
+
|
|
673
678
|
const freshState = await getMarginfiAccountPositionState(
|
|
674
679
|
this.umi,
|
|
675
680
|
{ pk: this.marginfiAccountPk },
|
|
676
681
|
this.marginfiGroup,
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
: undefined,
|
|
680
|
-
!this.selfManaged && this.solautoPositionData === null
|
|
681
|
-
? { mint: this.debtMint }
|
|
682
|
-
: undefined,
|
|
682
|
+
useDesignatedMint ? { mint: this.supplyMint } : undefined,
|
|
683
|
+
useDesignatedMint ? { mint: this.debtMint } : undefined,
|
|
683
684
|
this.livePositionUpdates
|
|
684
685
|
);
|
|
685
686
|
|
|
@@ -805,10 +805,13 @@ export function getErrorInfo(umi: Umi, tx: TransactionBuilder, error: any) {
|
|
|
805
805
|
if (typeof error === "object" && (error as any)["InstructionError"]) {
|
|
806
806
|
const err = (error as any)["InstructionError"];
|
|
807
807
|
const errIx = tx.getInstructions()[Math.max(0, err[0] - 2)];
|
|
808
|
-
const errCode = err[1]["Custom"];
|
|
808
|
+
const errCode = typeof err[1] === "object" ? err[1]["Custom"] : undefined;
|
|
809
|
+
const errName = errCode === undefined ? err[1] as string : undefined;
|
|
810
|
+
let programName = "";
|
|
809
811
|
|
|
810
812
|
if (errIx.programId.toString() === umi.programs.get("solauto").publicKey.toString()) {
|
|
811
|
-
programError =
|
|
813
|
+
programError = getSolautoErrorFromCode(errCode, createSolautoProgram());
|
|
814
|
+
programName = "Haven";
|
|
812
815
|
if (
|
|
813
816
|
programError?.name ===
|
|
814
817
|
new InvalidRebalanceConditionError(createSolautoProgram()).name
|
|
@@ -816,17 +819,26 @@ export function getErrorInfo(umi: Umi, tx: TransactionBuilder, error: any) {
|
|
|
816
819
|
canBeIgnored = true;
|
|
817
820
|
}
|
|
818
821
|
} else if (errIx.programId === MARGINFI_PROGRAM_ID) {
|
|
822
|
+
programName = "Marginfi";
|
|
819
823
|
programError = getMarginfiErrorFromName(
|
|
820
824
|
errCode,
|
|
821
825
|
createMarginfiProgram()
|
|
822
826
|
);
|
|
823
827
|
} else if (errIx.programId === JUPITER_PROGRAM_ID) {
|
|
828
|
+
programName = "Jupiter";
|
|
824
829
|
programError = getJupiterErrorFromName(errCode, createJupiterProgram());
|
|
825
830
|
}
|
|
831
|
+
|
|
832
|
+
if (errName && errCode === undefined) {
|
|
833
|
+
errorName = `${programName ?? "Program"} error`;
|
|
834
|
+
errorInfo = errName;
|
|
835
|
+
}
|
|
826
836
|
}
|
|
827
837
|
|
|
828
|
-
|
|
829
|
-
|
|
838
|
+
if (programError) {
|
|
839
|
+
errorName = programError?.name;
|
|
840
|
+
errorInfo = programError?.message;
|
|
841
|
+
}
|
|
830
842
|
} catch {}
|
|
831
843
|
|
|
832
844
|
return {
|
|
@@ -15,7 +15,11 @@ import {
|
|
|
15
15
|
retryWithExponentialBackoff,
|
|
16
16
|
} from "../utils/generalUtils";
|
|
17
17
|
import { getErrorInfo, getTransactionChores } from "./transactionUtils";
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
PriorityFeeSetting,
|
|
20
|
+
TransactionItemInputs,
|
|
21
|
+
TransactionRunType,
|
|
22
|
+
} from "../types";
|
|
19
23
|
import { ReferralStateManager, TxHandler } from "../clients";
|
|
20
24
|
// import { sendJitoBundledTransactions } from "../utils/jitoUtils";
|
|
21
25
|
|
|
@@ -54,8 +58,6 @@ class LookupTables {
|
|
|
54
58
|
}
|
|
55
59
|
}
|
|
56
60
|
|
|
57
|
-
|
|
58
|
-
|
|
59
61
|
export class TransactionItem {
|
|
60
62
|
lookupTableAddresses!: string[];
|
|
61
63
|
tx?: TransactionBuilder;
|
|
@@ -197,7 +199,8 @@ export class TransactionsManager {
|
|
|
197
199
|
private mustBeAtomic?: boolean,
|
|
198
200
|
private errorsToThrow?: ErrorsToThrow,
|
|
199
201
|
private retries: number = 4,
|
|
200
|
-
private retryDelay: number = 150
|
|
202
|
+
private retryDelay: number = 150,
|
|
203
|
+
private confirmTimeout: number = 10000
|
|
201
204
|
) {
|
|
202
205
|
this.lookupTables = new LookupTables(
|
|
203
206
|
this.txHandler.defaultLookupTables(),
|
|
@@ -508,7 +511,7 @@ export class TransactionsManager {
|
|
|
508
511
|
this.txHandler.connection,
|
|
509
512
|
tx,
|
|
510
513
|
this.txType,
|
|
511
|
-
|
|
514
|
+
this.confirmTimeout,
|
|
512
515
|
prioritySetting,
|
|
513
516
|
() =>
|
|
514
517
|
this.updateStatus(
|
|
@@ -528,6 +531,7 @@ export class TransactionsManager {
|
|
|
528
531
|
} catch (e: any) {
|
|
529
532
|
const errorDetails = getErrorInfo(this.txHandler.umi, tx, e);
|
|
530
533
|
|
|
534
|
+
const errorString = `${errorDetails.errorName ?? "Unknown error"}: ${errorDetails.errorInfo ?? "unknown"}`;
|
|
531
535
|
this.updateStatus(
|
|
532
536
|
txName,
|
|
533
537
|
errorDetails.canBeIgnored
|
|
@@ -536,11 +540,9 @@ export class TransactionsManager {
|
|
|
536
540
|
attemptNum,
|
|
537
541
|
undefined,
|
|
538
542
|
undefined,
|
|
539
|
-
|
|
540
|
-
);
|
|
541
|
-
this.txHandler.log(
|
|
542
|
-
`${errorDetails.errorName ?? "Unknown error"}: ${errorDetails.errorInfo ?? "unknown"}`
|
|
543
|
+
errorString
|
|
543
544
|
);
|
|
545
|
+
this.txHandler.log(errorString);
|
|
544
546
|
|
|
545
547
|
if (!errorDetails.canBeIgnored) {
|
|
546
548
|
throw e;
|
|
@@ -36,12 +36,12 @@ export async function getTokenAccountData(umi: Umi, tokenAccount: PublicKey) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export function getSolautoPositionAccount(
|
|
39
|
-
|
|
39
|
+
authority: PublicKey,
|
|
40
40
|
positionId: number,
|
|
41
41
|
programId: PublicKey
|
|
42
42
|
) {
|
|
43
43
|
const [positionAccount, _] = PublicKey.findProgramAddressSync(
|
|
44
|
-
[bufferFromU8(positionId),
|
|
44
|
+
[bufferFromU8(positionId), authority.toBuffer()],
|
|
45
45
|
programId
|
|
46
46
|
);
|
|
47
47
|
|
package/src/utils/numberUtils.ts
CHANGED
package/src/utils/solanaUtils.ts
CHANGED
|
@@ -16,12 +16,15 @@ import {
|
|
|
16
16
|
import { createUmi } from "@metaplex-foundation/umi-bundle-defaults";
|
|
17
17
|
import {
|
|
18
18
|
AddressLookupTableAccount,
|
|
19
|
+
Blockhash,
|
|
20
|
+
BlockhashWithExpiryBlockHeight,
|
|
19
21
|
ComputeBudgetProgram,
|
|
20
22
|
Connection,
|
|
21
23
|
PublicKey,
|
|
22
24
|
RpcResponseAndContext,
|
|
23
25
|
SimulatedTransactionResponse,
|
|
24
26
|
SystemProgram,
|
|
27
|
+
Transaction,
|
|
25
28
|
TransactionInstruction,
|
|
26
29
|
VersionedTransaction,
|
|
27
30
|
} from "@solana/web3.js";
|
|
@@ -31,7 +34,11 @@ import {
|
|
|
31
34
|
createTransferInstruction,
|
|
32
35
|
} from "@solana/spl-token";
|
|
33
36
|
import { getTokenAccount } from "./accountUtils";
|
|
34
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
arraysAreEqual,
|
|
39
|
+
consoleLog,
|
|
40
|
+
retryWithExponentialBackoff,
|
|
41
|
+
} from "./generalUtils";
|
|
35
42
|
import {
|
|
36
43
|
getLendingAccountEndFlashloanInstructionDataSerializer,
|
|
37
44
|
getLendingAccountStartFlashloanInstructionDataSerializer,
|
|
@@ -50,7 +57,7 @@ export function buildIronforgeApiUrl(ironforgeApiKey: string) {
|
|
|
50
57
|
|
|
51
58
|
export function getSolanaRpcConnection(
|
|
52
59
|
rpcUrl: string,
|
|
53
|
-
programId: PublicKey = SOLAUTO_PROD_PROGRAM
|
|
60
|
+
programId: PublicKey = SOLAUTO_PROD_PROGRAM
|
|
54
61
|
): [Connection, Umi] {
|
|
55
62
|
const connection = new Connection(rpcUrl, "confirmed");
|
|
56
63
|
const umi = createUmi(connection).use({
|
|
@@ -285,12 +292,79 @@ export async function getComputeUnitPriceEstimate(
|
|
|
285
292
|
return feeEstimate;
|
|
286
293
|
}
|
|
287
294
|
|
|
295
|
+
async function spamSendTransactionUntilConfirmed(
|
|
296
|
+
connection: Connection,
|
|
297
|
+
transaction: Transaction | VersionedTransaction,
|
|
298
|
+
blockhash: BlockhashWithExpiryBlockHeight,
|
|
299
|
+
confirmTimeout: number = 10000,
|
|
300
|
+
spamInterval: number = 1000
|
|
301
|
+
): Promise<string> {
|
|
302
|
+
let spamAttempts = 0;
|
|
303
|
+
let confirmed = false;
|
|
304
|
+
let transactionSignature: string | null = null;
|
|
305
|
+
|
|
306
|
+
return new Promise<string>((resolve, reject) => {
|
|
307
|
+
const spamSend = async () => {
|
|
308
|
+
if (confirmed) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
try {
|
|
313
|
+
const txSignature = await connection.sendRawTransaction(
|
|
314
|
+
Buffer.from(transaction.serialize()),
|
|
315
|
+
{ skipPreflight: true, maxRetries: 0 }
|
|
316
|
+
);
|
|
317
|
+
transactionSignature = txSignature;
|
|
318
|
+
consoleLog(`Transaction sent`);
|
|
319
|
+
} catch (error) {
|
|
320
|
+
consoleLog("Error sending transaction:", error);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
spamAttempts++;
|
|
324
|
+
if (!confirmed) {
|
|
325
|
+
setTimeout(spamSend, spamInterval);
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
const confirmTransaction = async () => {
|
|
330
|
+
if (transactionSignature) {
|
|
331
|
+
try {
|
|
332
|
+
const { value } = await connection.confirmTransaction({
|
|
333
|
+
...blockhash,
|
|
334
|
+
signature: transactionSignature,
|
|
335
|
+
});
|
|
336
|
+
if (value.err) {
|
|
337
|
+
reject(value.err);
|
|
338
|
+
}
|
|
339
|
+
confirmed = true;
|
|
340
|
+
resolve(transactionSignature);
|
|
341
|
+
} catch (error) {
|
|
342
|
+
consoleLog("Error during confirmation:", error);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (!confirmed) {
|
|
347
|
+
setTimeout(confirmTransaction, 1000);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
spamSend();
|
|
352
|
+
confirmTransaction();
|
|
353
|
+
|
|
354
|
+
setTimeout(() => {
|
|
355
|
+
if (!confirmed) {
|
|
356
|
+
reject(new Error("Failed to confirm transaction within timeout"));
|
|
357
|
+
}
|
|
358
|
+
}, confirmTimeout);
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
|
|
288
362
|
export async function sendSingleOptimizedTransaction(
|
|
289
363
|
umi: Umi,
|
|
290
364
|
connection: Connection,
|
|
291
365
|
tx: TransactionBuilder,
|
|
292
366
|
txType?: TransactionRunType,
|
|
293
|
-
|
|
367
|
+
confirmTimeout: number = 10000,
|
|
294
368
|
prioritySetting: PriorityFeeSetting = PriorityFeeSetting.Default,
|
|
295
369
|
onAwaitingSign?: () => void
|
|
296
370
|
): Promise<Uint8Array | undefined> {
|
|
@@ -298,11 +372,7 @@ export async function sendSingleOptimizedTransaction(
|
|
|
298
372
|
consoleLog("Instructions: ", tx.getInstructions().length);
|
|
299
373
|
consoleLog("Serialized transaction size: ", tx.getTransactionSize(umi));
|
|
300
374
|
|
|
301
|
-
let cuPrice = await getComputeUnitPriceEstimate(
|
|
302
|
-
umi,
|
|
303
|
-
tx,
|
|
304
|
-
prioritySetting
|
|
305
|
-
);
|
|
375
|
+
let cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
|
|
306
376
|
if (!cuPrice) {
|
|
307
377
|
cuPrice = 1000000;
|
|
308
378
|
}
|
|
@@ -328,35 +398,46 @@ export async function sendSingleOptimizedTransaction(
|
|
|
328
398
|
),
|
|
329
399
|
3
|
|
330
400
|
);
|
|
331
|
-
|
|
332
|
-
computeUnitLimit = Math.round(
|
|
333
|
-
simulationResult.value.unitsConsumed! * 1.1
|
|
334
|
-
);
|
|
401
|
+
simulationResult.value.err;
|
|
402
|
+
computeUnitLimit = Math.round(simulationResult.value.unitsConsumed! * 1.05);
|
|
335
403
|
consoleLog("Compute unit limit: ", computeUnitLimit);
|
|
336
404
|
}
|
|
337
405
|
|
|
338
406
|
if (txType !== "only-simulate") {
|
|
339
407
|
onAwaitingSign?.();
|
|
340
|
-
const result = await assembleFinalTransaction(
|
|
408
|
+
// const result = await assembleFinalTransaction(
|
|
409
|
+
// umi.identity,
|
|
410
|
+
// tx,
|
|
411
|
+
// cuPrice,
|
|
412
|
+
// computeUnitLimit
|
|
413
|
+
// ).sendAndConfirm(umi, {
|
|
414
|
+
// send: {
|
|
415
|
+
// skipPreflight: true,
|
|
416
|
+
// commitment: "confirmed",
|
|
417
|
+
// maxRetries: 0
|
|
418
|
+
// },
|
|
419
|
+
// confirm: { commitment: "confirmed" },
|
|
420
|
+
// });
|
|
421
|
+
|
|
422
|
+
const blockhash = await connection.getLatestBlockhash("confirmed");
|
|
423
|
+
const signedTx = await assembleFinalTransaction(
|
|
341
424
|
umi.identity,
|
|
342
425
|
tx,
|
|
343
426
|
cuPrice,
|
|
344
427
|
computeUnitLimit
|
|
345
|
-
)
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
428
|
+
)
|
|
429
|
+
.setBlockhash(blockhash)
|
|
430
|
+
.buildAndSign(umi);
|
|
431
|
+
|
|
432
|
+
const txSig = await spamSendTransactionUntilConfirmed(
|
|
433
|
+
connection,
|
|
434
|
+
toWeb3JsTransaction(signedTx),
|
|
435
|
+
blockhash,
|
|
436
|
+
confirmTimeout
|
|
437
|
+
);
|
|
354
438
|
consoleLog(`Transaction signature: ${txSig}`);
|
|
355
439
|
consoleLog(`https://solscan.io/tx/${txSig}`);
|
|
356
|
-
|
|
357
|
-
throw new Error(result.result.value.err.toString());
|
|
358
|
-
}
|
|
359
|
-
return result.signature;
|
|
440
|
+
return bs58.decode(txSig);
|
|
360
441
|
}
|
|
361
442
|
|
|
362
443
|
return undefined;
|
|
@@ -36,7 +36,6 @@ describe("Solauto Marginfi tests", async () => {
|
|
|
36
36
|
const client = new SolautoMarginfiClient(
|
|
37
37
|
buildHeliusApiUrl(process.env.HELIUS_API_KEY!),
|
|
38
38
|
true,
|
|
39
|
-
SOLAUTO_TEST_PROGRAM
|
|
40
39
|
);
|
|
41
40
|
|
|
42
41
|
const supply = NATIVE_MINT;
|
|
@@ -129,7 +128,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
|
129
128
|
transactionItems.push(
|
|
130
129
|
new TransactionItem(
|
|
131
130
|
async (attemptNum) =>
|
|
132
|
-
await buildSolautoRebalanceTransaction(client,
|
|
131
|
+
await buildSolautoRebalanceTransaction(client, undefined, attemptNum),
|
|
133
132
|
"rebalance"
|
|
134
133
|
)
|
|
135
134
|
);
|