@zofai/zo-sdk 0.2.13 → 0.2.15
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/.claude/settings.local.json +11 -1
- package/dist/abstract/BaseDataAPI.cjs +1 -1
- package/dist/abstract/BaseDataAPI.cjs.map +1 -1
- package/dist/abstract/BaseDataAPI.mjs +1 -1
- package/dist/abstract/BaseDataAPI.mjs.map +1 -1
- package/dist/consts/deployments-usdz-mainnet.json +1 -31
- package/dist/consts/deployments-zo-oracle-mainnet.json +329 -0
- package/dist/consts/index.cjs +35 -1
- package/dist/consts/index.cjs.map +1 -1
- package/dist/consts/index.d.cts +45 -0
- package/dist/consts/index.d.cts.map +1 -1
- package/dist/consts/index.d.mts +45 -0
- package/dist/consts/index.d.mts.map +1 -1
- package/dist/consts/index.mjs +31 -0
- package/dist/consts/index.mjs.map +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.mjs +1 -1
- package/dist/data.mjs.map +1 -1
- package/dist/implementations/USDZAPI.cjs +426 -78
- package/dist/implementations/USDZAPI.cjs.map +1 -1
- package/dist/implementations/USDZAPI.d.cts +54 -0
- package/dist/implementations/USDZAPI.d.cts.map +1 -1
- package/dist/implementations/USDZAPI.d.mts +54 -0
- package/dist/implementations/USDZAPI.d.mts.map +1 -1
- package/dist/implementations/USDZAPI.mjs +427 -79
- package/dist/implementations/USDZAPI.mjs.map +1 -1
- package/dist/implementations/USDZDataAPI.cjs +38 -0
- package/dist/implementations/USDZDataAPI.cjs.map +1 -1
- package/dist/implementations/USDZDataAPI.d.cts +16 -0
- package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
- package/dist/implementations/USDZDataAPI.d.mts +16 -0
- package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
- package/dist/implementations/USDZDataAPI.mjs +38 -0
- package/dist/implementations/USDZDataAPI.mjs.map +1 -1
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/base.d.cts +19 -1
- package/dist/interfaces/base.d.cts.map +1 -1
- package/dist/interfaces/base.d.mts +19 -1
- package/dist/interfaces/base.d.mts.map +1 -1
- package/dist/interfaces/usdz.d.cts +17 -0
- package/dist/interfaces/usdz.d.cts.map +1 -1
- package/dist/interfaces/usdz.d.mts +17 -0
- package/dist/interfaces/usdz.d.mts.map +1 -1
- package/dist/oracle.cjs +119 -1
- package/dist/oracle.cjs.map +1 -1
- package/dist/oracle.d.cts +57 -1
- package/dist/oracle.d.cts.map +1 -1
- package/dist/oracle.d.mts +57 -1
- package/dist/oracle.d.mts.map +1 -1
- package/dist/oracle.mjs +120 -2
- package/dist/oracle.mjs.map +1 -1
- package/dist/oraclePro.cjs +214 -0
- package/dist/oraclePro.cjs.map +1 -0
- package/dist/oraclePro.d.cts +92 -0
- package/dist/oraclePro.d.cts.map +1 -0
- package/dist/oraclePro.d.mts +92 -0
- package/dist/oraclePro.d.mts.map +1 -0
- package/dist/oraclePro.mjs +196 -0
- package/dist/oraclePro.mjs.map +1 -0
- package/dist/pythProClient.cjs +277 -0
- package/dist/pythProClient.cjs.map +1 -0
- package/dist/pythProClient.d.cts +143 -0
- package/dist/pythProClient.d.cts.map +1 -0
- package/dist/pythProClient.d.mts +143 -0
- package/dist/pythProClient.d.mts.map +1 -0
- package/dist/pythProClient.mjs +269 -0
- package/dist/pythProClient.mjs.map +1 -0
- package/dist/storkClient.cjs +217 -0
- package/dist/storkClient.cjs.map +1 -0
- package/dist/storkClient.d.cts +90 -0
- package/dist/storkClient.d.cts.map +1 -0
- package/dist/storkClient.d.mts +90 -0
- package/dist/storkClient.d.mts.map +1 -0
- package/dist/storkClient.mjs +208 -0
- package/dist/storkClient.mjs.map +1 -0
- package/dist/storkOracle.cjs +61 -0
- package/dist/storkOracle.cjs.map +1 -0
- package/dist/storkOracle.d.cts +21 -0
- package/dist/storkOracle.d.cts.map +1 -0
- package/dist/storkOracle.d.mts +21 -0
- package/dist/storkOracle.d.mts.map +1 -0
- package/dist/storkOracle.mjs +56 -0
- package/dist/storkOracle.mjs.map +1 -0
- package/package.json +1 -1
- package/src/abstract/BaseDataAPI.ts +1 -1
- package/src/consts/deployments-usdz-mainnet.json +1 -31
- package/src/consts/deployments-zo-oracle-mainnet.json +329 -0
- package/src/consts/index.ts +80 -0
- package/src/data.ts +1 -1
- package/src/implementations/USDZAPI.ts +731 -101
- package/src/implementations/USDZDataAPI.ts +42 -0
- package/src/index.ts +3 -0
- package/src/interfaces/base.ts +54 -1
- package/src/interfaces/usdz.ts +125 -0
- package/src/oracle.ts +222 -1
- package/src/oraclePro.ts +312 -0
- package/src/pythProClient.ts +406 -0
- package/src/storkClient.ts +328 -0
- package/src/storkOracle.ts +82 -0
- package/tests/pythProClient.test.ts +155 -0
- package/tests/storkClient.test.ts +316 -0
|
@@ -9,7 +9,9 @@ const kiosk_1 = require("@mysten/kiosk");
|
|
|
9
9
|
const transactions_1 = require("@mysten/sui/transactions");
|
|
10
10
|
const utils_1 = require("@mysten/sui/utils");
|
|
11
11
|
const abstract_1 = require("../abstract/index.cjs");
|
|
12
|
+
const coins_1 = require("../coins.cjs");
|
|
12
13
|
const consts_1 = require("../consts/index.cjs");
|
|
14
|
+
const oraclePro_1 = require("../oraclePro.cjs");
|
|
13
15
|
const utils_2 = require("../utils.cjs");
|
|
14
16
|
const USDZDataAPI_1 = require("./USDZDataAPI.cjs");
|
|
15
17
|
class USDZAPI extends abstract_1.BaseAPI {
|
|
@@ -17,6 +19,59 @@ class USDZAPI extends abstract_1.BaseAPI {
|
|
|
17
19
|
super(network, provider, apiEndpoint, connectionURL, consts_1.LPToken.USDZ);
|
|
18
20
|
this.dataAPI = new USDZDataAPI_1.USDZDataAPI(network, provider, apiEndpoint, connectionURL);
|
|
19
21
|
}
|
|
22
|
+
usdzLpType() {
|
|
23
|
+
return `${this.consts.zoCore.package}::usdz::USDZ`;
|
|
24
|
+
}
|
|
25
|
+
positionTypeArgs(collateralToken, indexToken, long) {
|
|
26
|
+
return [
|
|
27
|
+
this.usdzLpType(),
|
|
28
|
+
this.consts.coins[collateralToken].module,
|
|
29
|
+
this.consts.coins[indexToken].module,
|
|
30
|
+
`${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
|
|
31
|
+
this.consts.coins[collateralToken].module,
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
redeemTypeArgs(collateralToken, indexToken, long) {
|
|
35
|
+
return [
|
|
36
|
+
this.usdzLpType(),
|
|
37
|
+
this.consts.coins[collateralToken].module,
|
|
38
|
+
this.consts.coins[indexToken].module,
|
|
39
|
+
`${this.consts.zoCore.package}::market::${long ? 'LONG' : 'SHORT'}`,
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
async initV3OracleForTokens(tokens, tx, pythProUpdateBytes, includeEmaPrice, options) {
|
|
43
|
+
const result = await this.initV3OracleTxb(tokens, tx, {
|
|
44
|
+
rawUpdateBytes: pythProUpdateBytes,
|
|
45
|
+
includeEmaPrice,
|
|
46
|
+
...options,
|
|
47
|
+
});
|
|
48
|
+
return { tx: result.tx, oracle: result.oracle };
|
|
49
|
+
}
|
|
50
|
+
/** Vault + symbol index tokens required for valuate_vault_v2 / valuate_symbol_v2. */
|
|
51
|
+
getValuationOracleTokens() {
|
|
52
|
+
const tokens = new Set(Object.keys(this.consts.zoCore.vaults));
|
|
53
|
+
for (const key of Object.keys(this.consts.zoCore.symbols)) {
|
|
54
|
+
const [, token] = (0, utils_2.parseSymbolKey)(key);
|
|
55
|
+
tokens.add(token);
|
|
56
|
+
}
|
|
57
|
+
return [...tokens];
|
|
58
|
+
}
|
|
59
|
+
/** Pyth Pro oracle init for deposit / withdraw market valuation. */
|
|
60
|
+
async initValuationOracle(tx) {
|
|
61
|
+
const tokens = this.getValuationOracleTokens();
|
|
62
|
+
const pythProUpdateBytes = await this.fetchPythProUpdateBytesForTokens(tokens);
|
|
63
|
+
return this.initV3OracleForTokens(tokens, tx, pythProUpdateBytes);
|
|
64
|
+
}
|
|
65
|
+
async resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender) {
|
|
66
|
+
if (!sponsoredTx) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
const additional = collateralToken === 'sui' ? relayerFee : 0n;
|
|
70
|
+
if (additional === 0n) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
return (0, coins_1.resolveSpendableSuiCoin)(tx, this.provider, this.requireSenderForSponsored(sender), additional);
|
|
74
|
+
}
|
|
20
75
|
calcPositionReserveFeeAmount(_position) {
|
|
21
76
|
throw new Error(`Method not implemented in ${this.constructor.name}.`);
|
|
22
77
|
}
|
|
@@ -689,35 +744,10 @@ class USDZAPI extends abstract_1.BaseAPI {
|
|
|
689
744
|
if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
|
|
690
745
|
tx = await this.addReferral(referralAddress, tx);
|
|
691
746
|
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
const oracle = await this.initOracleTxb(pythFeederKeys, tx, true, {
|
|
697
|
-
sender: this.requireSenderForSponsored(sender),
|
|
698
|
-
additionalSuiAmount: coin === 'sui' ? BigInt(amount) : 0n,
|
|
699
|
-
});
|
|
700
|
-
tx = oracle.tx;
|
|
701
|
-
const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx: true, suiCoinObject: oracle.suiCoinObject, sender });
|
|
702
|
-
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
|
|
703
|
-
tx.moveCall({
|
|
704
|
-
target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
|
|
705
|
-
typeArguments: [`${this.consts.zoCore.package}::usdz::USDZ`, this.consts.coins[coin].module],
|
|
706
|
-
arguments: [
|
|
707
|
-
tx.object(this.consts.zoCore.market),
|
|
708
|
-
tx.object(this.consts.zoCore.rebaseFeeModel),
|
|
709
|
-
depositObject,
|
|
710
|
-
tx.pure.u64(minAmountOut),
|
|
711
|
-
vaultsValuation,
|
|
712
|
-
symbolsValuation,
|
|
713
|
-
],
|
|
714
|
-
});
|
|
715
|
-
return tx;
|
|
716
|
-
}
|
|
717
|
-
// Handle non-sponsored transaction case
|
|
718
|
-
tx = (await this.initOracleTxb(pythFeederKeys, tx)).tx;
|
|
719
|
-
const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sender });
|
|
720
|
-
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
|
|
747
|
+
const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
|
|
748
|
+
tx = txWithOracle;
|
|
749
|
+
const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx, sender });
|
|
750
|
+
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
|
|
721
751
|
tx.moveCall({
|
|
722
752
|
target: `${this.consts.zoCore.upgradedPackage}::market::deposit`,
|
|
723
753
|
typeArguments: [
|
|
@@ -746,35 +776,10 @@ class USDZAPI extends abstract_1.BaseAPI {
|
|
|
746
776
|
if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
|
|
747
777
|
tx = await this.addReferral(referralAddress, tx);
|
|
748
778
|
}
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
const oracle = await this.initOracleTxb(pythFeederKeys, tx, true, {
|
|
754
|
-
sender: this.requireSenderForSponsored(sender),
|
|
755
|
-
additionalSuiAmount: coin === 'sui' ? BigInt(amount) : 0n,
|
|
756
|
-
});
|
|
757
|
-
tx = oracle.tx;
|
|
758
|
-
const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx: true, suiCoinObject: oracle.suiCoinObject, sender });
|
|
759
|
-
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
|
|
760
|
-
const [mintedCoin] = tx.moveCall({
|
|
761
|
-
target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
|
|
762
|
-
typeArguments: [`${this.consts.zoCore.package}::usdz::USDZ`, this.consts.coins[coin].module],
|
|
763
|
-
arguments: [
|
|
764
|
-
tx.object(this.consts.zoCore.market),
|
|
765
|
-
tx.object(this.consts.zoCore.rebaseFeeModel),
|
|
766
|
-
depositObject,
|
|
767
|
-
tx.pure.u64(minAmountOut),
|
|
768
|
-
vaultsValuation,
|
|
769
|
-
symbolsValuation,
|
|
770
|
-
],
|
|
771
|
-
});
|
|
772
|
-
return mintedCoin;
|
|
773
|
-
}
|
|
774
|
-
// Handle non-sponsored transaction case
|
|
775
|
-
tx = (await this.initOracleTxb(pythFeederKeys, tx)).tx;
|
|
776
|
-
const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sender });
|
|
777
|
-
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
|
|
779
|
+
const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
|
|
780
|
+
tx = txWithOracle;
|
|
781
|
+
const depositObject = await this.resolveSplitCoinObject(tx, coin, BigInt(amount), coinObjects, { sponsoredTx, sender });
|
|
782
|
+
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
|
|
778
783
|
const [mintedCoin] = tx.moveCall({
|
|
779
784
|
target: `${this.consts.zoCore.upgradedPackage}::market::deposit_ptb`,
|
|
780
785
|
typeArguments: [
|
|
@@ -800,22 +805,10 @@ class USDZAPI extends abstract_1.BaseAPI {
|
|
|
800
805
|
throw new Error(`${this.constructor.name}: lpCoinObjects or sender is required`);
|
|
801
806
|
}
|
|
802
807
|
let tx = new transactions_1.Transaction();
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
const oracle = await this.initOracleTxb(pythFeederKeys, tx, true, {
|
|
808
|
-
sender: this.requireSenderForSponsored(sender),
|
|
809
|
-
additionalSuiAmount: 0n,
|
|
810
|
-
});
|
|
811
|
-
tx = oracle.tx;
|
|
812
|
-
suiCoinObject = oracle.suiCoinObject;
|
|
813
|
-
}
|
|
814
|
-
else {
|
|
815
|
-
tx = (await this.initOracleTxb(pythFeederKeys, tx)).tx;
|
|
816
|
-
}
|
|
817
|
-
const withdrawObject = await this.resolveSplitCoinObject(tx, 'usdz', BigInt(amount), lpCoinObjects, { sponsoredTx, suiCoinObject, sender });
|
|
818
|
-
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
|
|
808
|
+
const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
|
|
809
|
+
tx = txWithOracle;
|
|
810
|
+
const withdrawObject = await this.resolveSplitCoinObject(tx, 'usdz', BigInt(amount), lpCoinObjects, { sponsoredTx, sender });
|
|
811
|
+
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
|
|
819
812
|
tx.moveCall({
|
|
820
813
|
target: `${this.consts.zoCore.upgradedPackage}::market::withdraw`,
|
|
821
814
|
typeArguments: [
|
|
@@ -840,10 +833,9 @@ class USDZAPI extends abstract_1.BaseAPI {
|
|
|
840
833
|
if (!tx) {
|
|
841
834
|
tx = new transactions_1.Transaction();
|
|
842
835
|
}
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuate(tx);
|
|
836
|
+
const { tx: txWithOracle, oracle: oracleBundle } = await this.initValuationOracle(tx);
|
|
837
|
+
tx = txWithOracle;
|
|
838
|
+
const { vaultsValuation, symbolsValuation } = this.dataAPI.valuateV2(tx, oracleBundle);
|
|
847
839
|
tx.moveCall({
|
|
848
840
|
target: `${this.consts.zoCore.upgradedPackage}::market::withdraw`,
|
|
849
841
|
typeArguments: [
|
|
@@ -1782,6 +1774,362 @@ class USDZAPI extends abstract_1.BaseAPI {
|
|
|
1782
1774
|
],
|
|
1783
1775
|
});
|
|
1784
1776
|
}
|
|
1777
|
+
// --- Pyth Pro + Stork (v3) ---
|
|
1778
|
+
/**
|
|
1779
|
+
* Swaps tokens using swap_v3 (Pyth Pro + Stork). Transfers output to sender.
|
|
1780
|
+
*/
|
|
1781
|
+
async swapV3(fromToken, toToken, fromAmount, fromCoinObjects, pythProUpdateBytes, minAmountOut, tx) {
|
|
1782
|
+
if (!tx) {
|
|
1783
|
+
tx = new transactions_1.Transaction();
|
|
1784
|
+
}
|
|
1785
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens(Object.keys(this.consts.zoCore.vaults), tx, pythProUpdateBytes, true);
|
|
1786
|
+
const fromCoinObject = this.processCoins(tx_, fromToken, fromCoinObjects);
|
|
1787
|
+
const [fromDepositObject] = tx_.splitCoins(fromCoinObject, [tx_.pure.u64(fromAmount)]);
|
|
1788
|
+
const vaultsValuation = this.dataAPI.valuateVaultsV2(tx_, oracle);
|
|
1789
|
+
tx_.moveCall({
|
|
1790
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::swap_v3`,
|
|
1791
|
+
typeArguments: [
|
|
1792
|
+
this.usdzLpType(),
|
|
1793
|
+
this.consts.coins[fromToken].module,
|
|
1794
|
+
this.consts.coins[toToken].module,
|
|
1795
|
+
],
|
|
1796
|
+
arguments: [
|
|
1797
|
+
tx_.object(this.consts.zoCore.market),
|
|
1798
|
+
tx_.object(this.consts.zoCore.rebaseFeeModel),
|
|
1799
|
+
fromDepositObject,
|
|
1800
|
+
tx_.pure.u64(minAmountOut || 0),
|
|
1801
|
+
vaultsValuation,
|
|
1802
|
+
...(0, oraclePro_1.oracleArgsWithClock)(oracle),
|
|
1803
|
+
],
|
|
1804
|
+
});
|
|
1805
|
+
return tx_;
|
|
1806
|
+
}
|
|
1807
|
+
/**
|
|
1808
|
+
* Swaps tokens and returns the output coin (swap_v3_ptb).
|
|
1809
|
+
*/
|
|
1810
|
+
async swapV3Ptb(fromToken, toToken, fromAmount, fromCoinObjects, pythProUpdateBytes, minAmountOut, tx) {
|
|
1811
|
+
if (!tx) {
|
|
1812
|
+
tx = new transactions_1.Transaction();
|
|
1813
|
+
}
|
|
1814
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens(Object.keys(this.consts.zoCore.vaults), tx, pythProUpdateBytes, true);
|
|
1815
|
+
const fromCoinObject = this.processCoins(tx_, fromToken, fromCoinObjects);
|
|
1816
|
+
const [fromDepositObject] = tx_.splitCoins(fromCoinObject, [tx_.pure.u64(fromAmount)]);
|
|
1817
|
+
const vaultsValuation = this.dataAPI.valuateVaultsV2(tx_, oracle);
|
|
1818
|
+
const [outputCoin] = tx_.moveCall({
|
|
1819
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::swap_v3_ptb`,
|
|
1820
|
+
typeArguments: [
|
|
1821
|
+
this.usdzLpType(),
|
|
1822
|
+
this.consts.coins[fromToken].module,
|
|
1823
|
+
this.consts.coins[toToken].module,
|
|
1824
|
+
],
|
|
1825
|
+
arguments: [
|
|
1826
|
+
tx_.object(this.consts.zoCore.market),
|
|
1827
|
+
tx_.object(this.consts.zoCore.rebaseFeeModel),
|
|
1828
|
+
fromDepositObject,
|
|
1829
|
+
tx_.pure.u64(minAmountOut || 0),
|
|
1830
|
+
vaultsValuation,
|
|
1831
|
+
...(0, oraclePro_1.oracleArgsWithClock)(oracle),
|
|
1832
|
+
],
|
|
1833
|
+
});
|
|
1834
|
+
return outputCoin;
|
|
1835
|
+
}
|
|
1836
|
+
/**
|
|
1837
|
+
* Opens a position using open_position_v3 (Pyth Pro + Stork).
|
|
1838
|
+
*/
|
|
1839
|
+
async openPositionV3(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, pythProUpdateBytes, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx) {
|
|
1840
|
+
let tx = new transactions_1.Transaction();
|
|
1841
|
+
if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
|
|
1842
|
+
tx = await this.addReferral(referralAddress, tx);
|
|
1843
|
+
}
|
|
1844
|
+
const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
|
|
1845
|
+
const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
|
|
1846
|
+
const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
|
|
1847
|
+
const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
|
|
1848
|
+
let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
|
|
1849
|
+
if (isLimitOrder) {
|
|
1850
|
+
allowTrade = isIocOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
|
|
1851
|
+
}
|
|
1852
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
|
|
1853
|
+
tx = tx_;
|
|
1854
|
+
const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
|
|
1855
|
+
const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
|
|
1856
|
+
tx.moveCall({
|
|
1857
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::open_position_v3`,
|
|
1858
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
1859
|
+
arguments: [
|
|
1860
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
1861
|
+
tx.object(this.consts.zoCore.market),
|
|
1862
|
+
tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
|
|
1863
|
+
...(0, oraclePro_1.oracleArgsStandard)(oracle),
|
|
1864
|
+
depositObject,
|
|
1865
|
+
feeObject,
|
|
1866
|
+
tx.pure.u8(allowTrade),
|
|
1867
|
+
tx.pure.u64(size),
|
|
1868
|
+
tx.pure.u64(reserveAmount),
|
|
1869
|
+
tx.pure.u256(adjustCollateralPrice),
|
|
1870
|
+
tx.pure.u256(adjustPrice),
|
|
1871
|
+
tx.pure.u256(indexPriceThreshold),
|
|
1872
|
+
],
|
|
1873
|
+
});
|
|
1874
|
+
return tx;
|
|
1875
|
+
}
|
|
1876
|
+
/**
|
|
1877
|
+
* Opens a position with S Card using open_position_with_scard_v3.
|
|
1878
|
+
*/
|
|
1879
|
+
async openPositionWithSCardV3(collateralToken, indexToken, size, collateralAmount, coinObjects, long, reserveAmount, indexPrice, collateralPrice, kioskClient, kioskCap, scard, pythProUpdateBytes, isLimitOrder, isIocOrder, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), referralAddress, sender, sponsoredTx) {
|
|
1880
|
+
let tx = new transactions_1.Transaction();
|
|
1881
|
+
if (referralAddress && !(await this.dataAPI.hasReferral(sender || ''))) {
|
|
1882
|
+
tx = await this.addReferral(referralAddress, tx);
|
|
1883
|
+
}
|
|
1884
|
+
const symbol = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
|
|
1885
|
+
const adjustPrice = this.processSlippage(indexPrice, long, isLimitOrder ? 0 : pricesSlippage);
|
|
1886
|
+
const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
|
|
1887
|
+
const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
|
|
1888
|
+
let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
|
|
1889
|
+
if (isLimitOrder) {
|
|
1890
|
+
allowTrade = isIocOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
|
|
1891
|
+
}
|
|
1892
|
+
const kioskTx = new kiosk_1.KioskTransaction({
|
|
1893
|
+
transaction: tx,
|
|
1894
|
+
kioskClient,
|
|
1895
|
+
cap: kioskCap,
|
|
1896
|
+
});
|
|
1897
|
+
const [sudoCard, promise] = kioskTx.borrow({
|
|
1898
|
+
itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
|
|
1899
|
+
itemId: scard,
|
|
1900
|
+
});
|
|
1901
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
|
|
1902
|
+
tx = tx_;
|
|
1903
|
+
const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
|
|
1904
|
+
const [depositObject, feeObject] = this.processCoinSplitting(tx, collateralToken, coinObjects, [tx.pure.u64(collateralAmount), tx.pure.u64(relayerFee)], sponsoredTx, suiCoinObject);
|
|
1905
|
+
tx.moveCall({
|
|
1906
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::open_position_with_scard_v3`,
|
|
1907
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
1908
|
+
arguments: [
|
|
1909
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
1910
|
+
tx.object(this.consts.zoCore.market),
|
|
1911
|
+
tx.object(this.consts.zoCore.symbols[symbol].positionConfig),
|
|
1912
|
+
...(0, oraclePro_1.oracleArgsStandard)(oracle),
|
|
1913
|
+
depositObject,
|
|
1914
|
+
feeObject,
|
|
1915
|
+
tx.pure.u8(allowTrade),
|
|
1916
|
+
tx.pure.u64(size),
|
|
1917
|
+
tx.pure.u64(reserveAmount),
|
|
1918
|
+
tx.pure.u256(adjustCollateralPrice),
|
|
1919
|
+
tx.pure.u256(adjustPrice),
|
|
1920
|
+
tx.pure.u256(indexPriceThreshold),
|
|
1921
|
+
sudoCard,
|
|
1922
|
+
],
|
|
1923
|
+
});
|
|
1924
|
+
kioskTx
|
|
1925
|
+
.return({
|
|
1926
|
+
itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
|
|
1927
|
+
item: sudoCard,
|
|
1928
|
+
promise,
|
|
1929
|
+
})
|
|
1930
|
+
.finalize();
|
|
1931
|
+
return tx;
|
|
1932
|
+
}
|
|
1933
|
+
/**
|
|
1934
|
+
* Decreases a position using decrease_position_v3.
|
|
1935
|
+
*/
|
|
1936
|
+
async decreasePositionV3(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, pythProUpdateBytes, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, sender) {
|
|
1937
|
+
if (!coinObjects?.length && !sender) {
|
|
1938
|
+
throw new Error(`${this.constructor.name}: coinObjects or sender is required`);
|
|
1939
|
+
}
|
|
1940
|
+
let tx = new transactions_1.Transaction();
|
|
1941
|
+
const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
|
|
1942
|
+
const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
|
|
1943
|
+
const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
|
|
1944
|
+
let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
|
|
1945
|
+
if (isTriggerOrder) {
|
|
1946
|
+
allowTrade = isIocOrder || !isTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
|
|
1947
|
+
}
|
|
1948
|
+
else {
|
|
1949
|
+
isTakeProfitOrder = true;
|
|
1950
|
+
}
|
|
1951
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
|
|
1952
|
+
tx = tx_;
|
|
1953
|
+
const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
|
|
1954
|
+
const feeObject = await this.resolveRelayerFeeObject(tx, collateralToken, coinObjects ?? [], relayerFee, sponsoredTx, suiCoinObject, sender);
|
|
1955
|
+
tx.moveCall({
|
|
1956
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_v3`,
|
|
1957
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
1958
|
+
arguments: [
|
|
1959
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
1960
|
+
tx.object(this.consts.zoCore.market),
|
|
1961
|
+
tx.object(pcpId),
|
|
1962
|
+
...(0, oraclePro_1.oracleArgsStandard)(oracle),
|
|
1963
|
+
feeObject,
|
|
1964
|
+
tx.pure.u8(allowTrade),
|
|
1965
|
+
tx.pure.bool(isTakeProfitOrder),
|
|
1966
|
+
tx.pure.u64(amount),
|
|
1967
|
+
tx.pure.u256(adjustCollateralPrice),
|
|
1968
|
+
tx.pure.u256(adjustPrice),
|
|
1969
|
+
tx.pure.u256(indexPriceThreshold),
|
|
1970
|
+
],
|
|
1971
|
+
});
|
|
1972
|
+
return tx;
|
|
1973
|
+
}
|
|
1974
|
+
/**
|
|
1975
|
+
* Decreases a position with S Card using decrease_position_with_scard_v3.
|
|
1976
|
+
*/
|
|
1977
|
+
async decreasePositionWithSCardV3(pcpId, collateralToken, indexToken, amount, long, indexPrice, collateralPrice, kioskClient, kioskCap, scard, pythProUpdateBytes, isTriggerOrder = false, isTakeProfitOrder = true, isIocOrder = false, pricesSlippage = 0.003, collateralSlippage = 0.5, relayerFee = BigInt(0.5), coinObjects, sponsoredTx, sender) {
|
|
1978
|
+
if (!coinObjects?.length && !sender) {
|
|
1979
|
+
throw new Error(`${this.constructor.name}: coinObjects or sender is required`);
|
|
1980
|
+
}
|
|
1981
|
+
let tx = new transactions_1.Transaction();
|
|
1982
|
+
const kioskTx = new kiosk_1.KioskTransaction({
|
|
1983
|
+
transaction: tx,
|
|
1984
|
+
kioskClient,
|
|
1985
|
+
cap: kioskCap,
|
|
1986
|
+
});
|
|
1987
|
+
const [sudoCard, promise] = kioskTx.borrow({
|
|
1988
|
+
itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
|
|
1989
|
+
itemId: scard,
|
|
1990
|
+
});
|
|
1991
|
+
const adjustPrice = this.processSlippage(indexPrice, !long, isTriggerOrder ? 0 : pricesSlippage);
|
|
1992
|
+
const adjustCollateralPrice = this.processSlippage(collateralPrice, false, collateralSlippage);
|
|
1993
|
+
const indexPriceThreshold = this.processPriceThreshold(indexPrice, pricesSlippage);
|
|
1994
|
+
let allowTrade = consts_1.ALLOW_TRADE_MUST_TRADE;
|
|
1995
|
+
if (isTriggerOrder) {
|
|
1996
|
+
allowTrade = isIocOrder || !isTakeProfitOrder ? consts_1.ALLOW_TRADE_NO_TRADE : consts_1.ALLOW_TRADE_CAN_TRADE;
|
|
1997
|
+
}
|
|
1998
|
+
else {
|
|
1999
|
+
isTakeProfitOrder = true;
|
|
2000
|
+
}
|
|
2001
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
|
|
2002
|
+
tx = tx_;
|
|
2003
|
+
const suiCoinObject = await this.resolveSponsoredSui(tx, collateralToken, relayerFee, sponsoredTx, sender);
|
|
2004
|
+
const feeObject = await this.resolveRelayerFeeObject(tx, collateralToken, coinObjects ?? [], relayerFee, sponsoredTx, suiCoinObject, sender);
|
|
2005
|
+
tx.moveCall({
|
|
2006
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::decrease_position_with_scard_v3`,
|
|
2007
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
2008
|
+
arguments: [
|
|
2009
|
+
tx.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
2010
|
+
tx.object(this.consts.zoCore.market),
|
|
2011
|
+
tx.object(pcpId),
|
|
2012
|
+
...(0, oraclePro_1.oracleArgsStandard)(oracle),
|
|
2013
|
+
feeObject,
|
|
2014
|
+
tx.pure.u8(allowTrade),
|
|
2015
|
+
tx.pure.bool(isTakeProfitOrder),
|
|
2016
|
+
tx.pure.u64(amount),
|
|
2017
|
+
tx.pure.u256(adjustCollateralPrice),
|
|
2018
|
+
tx.pure.u256(adjustPrice),
|
|
2019
|
+
tx.pure.u256(indexPriceThreshold),
|
|
2020
|
+
sudoCard,
|
|
2021
|
+
],
|
|
2022
|
+
});
|
|
2023
|
+
kioskTx
|
|
2024
|
+
.return({
|
|
2025
|
+
itemType: `0xe7e651e4974fe367aa2837712d68081efb299c470242a15e2b9c26ea326159ec::card::SudoCard`,
|
|
2026
|
+
item: sudoCard,
|
|
2027
|
+
promise,
|
|
2028
|
+
})
|
|
2029
|
+
.finalize();
|
|
2030
|
+
return tx;
|
|
2031
|
+
}
|
|
2032
|
+
/**
|
|
2033
|
+
* Redeems collateral from a position via redeem_from_position_v2 (Pyth Pro path).
|
|
2034
|
+
*/
|
|
2035
|
+
async redeemFromPositionV2(pcpId, collateralToken, indexToken, amount, long, pythProUpdateBytes, tx) {
|
|
2036
|
+
if (!tx) {
|
|
2037
|
+
tx = new transactions_1.Transaction();
|
|
2038
|
+
}
|
|
2039
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
|
|
2040
|
+
tx_.moveCall({
|
|
2041
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::redeem_from_position_v2`,
|
|
2042
|
+
typeArguments: this.redeemTypeArgs(collateralToken, indexToken, long),
|
|
2043
|
+
arguments: [
|
|
2044
|
+
tx_.object(utils_1.SUI_CLOCK_OBJECT_ID),
|
|
2045
|
+
tx_.object(this.consts.zoCore.market),
|
|
2046
|
+
tx_.object(pcpId),
|
|
2047
|
+
...(0, oraclePro_1.oracleArgsStandard)(oracle),
|
|
2048
|
+
tx_.pure.u64(amount),
|
|
2049
|
+
],
|
|
2050
|
+
});
|
|
2051
|
+
return tx_;
|
|
2052
|
+
}
|
|
2053
|
+
/**
|
|
2054
|
+
* Liquidates a position (PTB-only public fun). Use liquidate_position_v3_1, not v3.
|
|
2055
|
+
*/
|
|
2056
|
+
liquidatePositionV3_1(tx, owner, positionId, collateralToken, indexToken, long, oracle) {
|
|
2057
|
+
tx.moveCall({
|
|
2058
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::liquidate_position_v3_1`,
|
|
2059
|
+
typeArguments: this.redeemTypeArgs(collateralToken, indexToken, long),
|
|
2060
|
+
arguments: [
|
|
2061
|
+
tx.object(this.consts.zoCore.market),
|
|
2062
|
+
...(0, oraclePro_1.oracleArgsAlt)(oracle),
|
|
2063
|
+
tx.object(owner),
|
|
2064
|
+
tx.object(positionId),
|
|
2065
|
+
],
|
|
2066
|
+
});
|
|
2067
|
+
}
|
|
2068
|
+
/**
|
|
2069
|
+
* Builds a full liquidate PTB including Pyth Pro verification.
|
|
2070
|
+
*/
|
|
2071
|
+
async liquidatePositionV3_1Tx(owner, positionId, collateralToken, indexToken, long, pythProUpdateBytes, tx) {
|
|
2072
|
+
if (!tx) {
|
|
2073
|
+
tx = new transactions_1.Transaction();
|
|
2074
|
+
}
|
|
2075
|
+
const { tx: tx_, oracle } = await this.initV3OracleForTokens([collateralToken, indexToken], tx, pythProUpdateBytes);
|
|
2076
|
+
this.liquidatePositionV3_1(tx_, owner, positionId, collateralToken, indexToken, long, (0, oraclePro_1.buildOracleInputsAlt)(oracle));
|
|
2077
|
+
return tx_;
|
|
2078
|
+
}
|
|
2079
|
+
/** Keeper/bot: execute_open_position_order_v3_1 (compose in PTB). */
|
|
2080
|
+
executeOpenPositionOrderV3_1(tx, owner, orderId, collateralToken, indexToken, long, oracle) {
|
|
2081
|
+
tx.moveCall({
|
|
2082
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::execute_open_position_order_v3_1`,
|
|
2083
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
2084
|
+
arguments: [
|
|
2085
|
+
tx.object(this.consts.zoCore.market),
|
|
2086
|
+
...(0, oraclePro_1.oracleArgsAlt)(oracle),
|
|
2087
|
+
tx.object(owner),
|
|
2088
|
+
tx.object(orderId),
|
|
2089
|
+
],
|
|
2090
|
+
});
|
|
2091
|
+
}
|
|
2092
|
+
/** Keeper/bot: execute_open_market_order_v3_1. */
|
|
2093
|
+
executeOpenMarketOrderV3_1(tx, owner, orderId, collateralToken, indexToken, long, oracle) {
|
|
2094
|
+
tx.moveCall({
|
|
2095
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::execute_open_market_order_v3_1`,
|
|
2096
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
2097
|
+
arguments: [
|
|
2098
|
+
tx.object(this.consts.zoCore.market),
|
|
2099
|
+
...(0, oraclePro_1.oracleArgsAlt)(oracle),
|
|
2100
|
+
tx.object(owner),
|
|
2101
|
+
tx.object(orderId),
|
|
2102
|
+
],
|
|
2103
|
+
});
|
|
2104
|
+
}
|
|
2105
|
+
/** Keeper/bot: execute_decrease_market_order_v3_1. */
|
|
2106
|
+
executeDecreaseMarketOrderV3_1(tx, owner, orderId, positionId, collateralToken, indexToken, long, oracle) {
|
|
2107
|
+
tx.moveCall({
|
|
2108
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::execute_decrease_market_order_v3_1`,
|
|
2109
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
2110
|
+
arguments: [
|
|
2111
|
+
tx.object(this.consts.zoCore.market),
|
|
2112
|
+
...(0, oraclePro_1.oracleArgsAlt)(oracle),
|
|
2113
|
+
tx.object(owner),
|
|
2114
|
+
tx.object(orderId),
|
|
2115
|
+
tx.object(positionId),
|
|
2116
|
+
],
|
|
2117
|
+
});
|
|
2118
|
+
}
|
|
2119
|
+
/** Keeper/bot: execute_decrease_position_order_v3_1. */
|
|
2120
|
+
executeDecreasePositionOrderV3_1(tx, owner, orderId, positionId, collateralToken, indexToken, long, oracle) {
|
|
2121
|
+
tx.moveCall({
|
|
2122
|
+
target: `${this.consts.zoCore.upgradedPackage}::market::execute_decrease_position_order_v3_1`,
|
|
2123
|
+
typeArguments: this.positionTypeArgs(collateralToken, indexToken, long),
|
|
2124
|
+
arguments: [
|
|
2125
|
+
tx.object(this.consts.zoCore.market),
|
|
2126
|
+
...(0, oraclePro_1.oracleArgsAlt)(oracle),
|
|
2127
|
+
tx.object(owner),
|
|
2128
|
+
tx.object(orderId),
|
|
2129
|
+
tx.object(positionId),
|
|
2130
|
+
],
|
|
2131
|
+
});
|
|
2132
|
+
}
|
|
1785
2133
|
}
|
|
1786
2134
|
exports.USDZAPI = USDZAPI;
|
|
1787
2135
|
//# sourceMappingURL=USDZAPI.cjs.map
|