@strkfarm/sdk 1.1.67 → 1.1.69

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/index.js CHANGED
@@ -535,6 +535,150 @@ var PricerBase = class {
535
535
  }
536
536
  };
537
537
 
538
+ // src/modules/avnu.ts
539
+ var import_starknet4 = require("starknet");
540
+ var import_avnu_sdk = require("@avnu/avnu-sdk");
541
+
542
+ // src/utils/oz-merkle.ts
543
+ var import_bytes = require("@ericnordelo/strk-merkle-tree/dist/bytes");
544
+ var import_core = require("@ericnordelo/strk-merkle-tree/dist/core");
545
+ var import_hashes = require("@ericnordelo/strk-merkle-tree/dist/hashes");
546
+ var import_merkletree = require("@ericnordelo/strk-merkle-tree/dist/merkletree");
547
+ var import_starknet2 = require("starknet");
548
+ var import_starknet3 = require("@scure/starknet");
549
+ function hash_leaf(leaf) {
550
+ if (leaf.data.length < 1) {
551
+ throw new Error("Invalid leaf data");
552
+ }
553
+ let firstElement = leaf.data[0];
554
+ let value = firstElement;
555
+ for (let i = 1; i < leaf.data.length; i++) {
556
+ value = pedersen_hash(value, leaf.data[i]);
557
+ }
558
+ return `0x${import_starknet2.num.toHexString(value).replace(/^0x/, "").padStart(64, "0")}`;
559
+ }
560
+ function pedersen_hash(a, b) {
561
+ return BigInt((0, import_starknet3.pedersen)(a, b).toString());
562
+ }
563
+ var StandardMerkleTree = class _StandardMerkleTree extends import_merkletree.MerkleTreeImpl {
564
+ constructor(tree, values, leafEncoding) {
565
+ super(tree, values, (leaf) => {
566
+ return hash_leaf(leaf);
567
+ });
568
+ this.tree = tree;
569
+ this.values = values;
570
+ this.leafEncoding = leafEncoding;
571
+ }
572
+ static of(values, leafEncoding = [], options = {}) {
573
+ const [tree, indexedValues] = import_merkletree.MerkleTreeImpl.prepare(values, options, (leaf) => {
574
+ return hash_leaf(leaf);
575
+ });
576
+ return new _StandardMerkleTree(tree, indexedValues, leafEncoding);
577
+ }
578
+ static verify(root, leafEncoding, leaf, proof) {
579
+ return (0, import_bytes.toHex)(root) === (0, import_core.processProof)((0, import_hashes.standardLeafHash)(leafEncoding, leaf), proof);
580
+ }
581
+ static verifyMultiProof(root, leafEncoding, multiproof) {
582
+ return (0, import_bytes.toHex)(root) === (0, import_core.processMultiProof)({
583
+ leaves: multiproof.leaves.map((leaf) => (0, import_hashes.standardLeafHash)(leafEncoding, leaf)),
584
+ proof: multiproof.proof,
585
+ proofFlags: multiproof.proofFlags
586
+ });
587
+ }
588
+ dump() {
589
+ return {
590
+ format: "standard-v1",
591
+ leafEncoding: this.leafEncoding,
592
+ tree: this.tree,
593
+ values: this.values
594
+ };
595
+ }
596
+ };
597
+
598
+ // src/utils/index.ts
599
+ function assert(condition, message) {
600
+ if (!condition) {
601
+ throw new Error(message);
602
+ }
603
+ }
604
+ function getTrovesEndpoint() {
605
+ return process.env.TROVES_ENDPOINT || "https://app.troves.fi";
606
+ }
607
+
608
+ // src/modules/avnu.ts
609
+ var AvnuWrapper = class {
610
+ async getQuotes(fromToken, toToken, amountWei, taker, retry = 0, excludeSources = ["Haiko(Solvers)"]) {
611
+ const MAX_RETRY = 5;
612
+ const params = {
613
+ sellTokenAddress: fromToken,
614
+ buyTokenAddress: toToken,
615
+ sellAmount: amountWei,
616
+ takerAddress: taker,
617
+ // excludeSources: ['Nostra', 'Haiko(Solvers)']
618
+ excludeSources
619
+ // excludeSources: ['Haiko(Solvers)'] // to resolve InvalidOraclePrice error
620
+ };
621
+ assert(fromToken != toToken, "From and to tokens are the same");
622
+ const quotes = await (0, import_avnu_sdk.fetchQuotes)(params);
623
+ const filteredQuotes = quotes.filter((q) => q.sellAmount.toString() == amountWei);
624
+ if (filteredQuotes.length == 0) {
625
+ if (retry < MAX_RETRY) {
626
+ await new Promise((res) => setTimeout(res, 3e3));
627
+ return await this.getQuotes(fromToken, toToken, amountWei, taker, retry + 1);
628
+ }
629
+ throw new Error("no quotes found");
630
+ }
631
+ return filteredQuotes[0];
632
+ }
633
+ async getSwapInfo(quote, taker, integratorFeeBps, integratorFeeRecipient, minAmount, options) {
634
+ const calldata = await (0, import_avnu_sdk.fetchBuildExecuteTransaction)(quote.quoteId, taker, void 0, void 0, options);
635
+ const call = calldata.calls[1];
636
+ const callData = call.calldata;
637
+ const routesLen = Number(callData[11]);
638
+ assert(routesLen > 0, "No routes found");
639
+ let startIndex = 12;
640
+ const routes = [];
641
+ for (let i = 0; i < routesLen; ++i) {
642
+ const swap_params_len = Number(callData[startIndex + 4]);
643
+ const route = {
644
+ token_from: callData[startIndex],
645
+ token_to: callData[startIndex + 1],
646
+ exchange_address: callData[startIndex + 2],
647
+ percent: Number(callData[startIndex + 3]),
648
+ additional_swap_params: swap_params_len > 0 ? callData.slice(startIndex + 5, startIndex + 5 + swap_params_len) : []
649
+ };
650
+ routes.push(route);
651
+ startIndex += 5 + swap_params_len;
652
+ }
653
+ const _minAmount = minAmount || (quote.buyAmount * 95n / 100n).toString();
654
+ const swapInfo = {
655
+ token_from_address: quote.sellTokenAddress,
656
+ token_from_amount: import_starknet4.uint256.bnToUint256(quote.sellAmount),
657
+ token_to_address: quote.buyTokenAddress,
658
+ token_to_amount: import_starknet4.uint256.bnToUint256(_minAmount),
659
+ token_to_min_amount: import_starknet4.uint256.bnToUint256(_minAmount),
660
+ beneficiary: taker,
661
+ integrator_fee_amount_bps: integratorFeeBps,
662
+ integrator_fee_recipient: integratorFeeRecipient,
663
+ routes
664
+ };
665
+ return swapInfo;
666
+ }
667
+ static buildZeroSwap(tokenToSell, beneficiary, tokenToBuy = tokenToSell) {
668
+ return {
669
+ token_from_address: tokenToSell.address,
670
+ token_from_amount: import_starknet4.uint256.bnToUint256(0),
671
+ token_to_address: tokenToBuy.address,
672
+ token_to_amount: import_starknet4.uint256.bnToUint256(0),
673
+ token_to_min_amount: import_starknet4.uint256.bnToUint256(0),
674
+ beneficiary,
675
+ integrator_fee_amount_bps: 0,
676
+ integrator_fee_recipient: beneficiary,
677
+ routes: []
678
+ };
679
+ }
680
+ };
681
+
538
682
  // src/modules/pricer.ts
539
683
  var Pricer = class extends PricerBase {
540
684
  // e.g. ETH/USDC
@@ -551,7 +695,7 @@ var Pricer = class extends PricerBase {
551
695
  */
552
696
  // ! switch to USDC (new) later
553
697
  this.PRICE_API = `https://api.coinbase.com/v2/prices/{{PRICER_KEY}}/buy`;
554
- this.EKUBO_API = "https://quoter-mainnet-api.ekubo.org/{{AMOUNT}}/{{TOKEN_ADDRESS}}/0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8";
698
+ this.EKUBO_API = "https://prod-api-quoter.ekubo.org/23448594291968334/{{AMOUNT}}/{{TOKEN_ADDRESS}}/0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb";
555
699
  this.refreshInterval = refreshInterval;
556
700
  this.staleTime = staleTime;
557
701
  }
@@ -685,6 +829,15 @@ var Pricer = class extends PricerBase {
685
829
  console.warn(`Ekubo: price err [${token.symbol}]: `, error.message);
686
830
  console.warn(`Ekubo: price err [${token.symbol}]: `, Object.keys(error));
687
831
  }
832
+ case "Avnu":
833
+ try {
834
+ const result = await this._getAvnuPrice(token, new Web3Number(token.priceCheckAmount ? token.priceCheckAmount : 1, token.decimals));
835
+ this.methodToUse[token.symbol] = "Avnu";
836
+ return result;
837
+ } catch (error) {
838
+ console.warn(`Avnu: price err [${token.symbol}]: `, error.message);
839
+ console.warn(`Avnu: price err [${token.symbol}]: `, Object.keys(error));
840
+ }
688
841
  }
689
842
  if (defaultMethod == "all") {
690
843
  return await this._getPrice(token, "Coinbase");
@@ -700,6 +853,22 @@ var Pricer = class extends PricerBase {
700
853
  async _getPriceCoinMarketCap(token) {
701
854
  throw new Error("Not implemented");
702
855
  }
856
+ async _getAvnuPrice(token, amountIn = new Web3Number(1, token.decimals), retry = 0) {
857
+ logger.verbose(`Getting price of ${token.symbol} using Ekubo, amountIn: ${amountIn.toWei()}`);
858
+ const avnuWrapper = new AvnuWrapper();
859
+ const usdcAddress = "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb";
860
+ const quote = await avnuWrapper.getQuotes(token.address.toString(), usdcAddress, amountIn.toWei(), "0x1");
861
+ const multiplier = 1 / amountIn.toNumber();
862
+ const outputUSDC = Number(Web3Number.fromWei(quote.buyAmount.toString(), 6).toFixed(6)) * multiplier;
863
+ logger.verbose(`Avnu: ${token.symbol} -> USDC: ${outputUSDC}, retry: ${retry}`);
864
+ if (outputUSDC === 0 && retry < 3) {
865
+ const amountIn2 = new Web3Number(100, token.decimals);
866
+ return await this._getAvnuPrice(token, amountIn2, retry + 1);
867
+ }
868
+ const usdcPrice = 1;
869
+ logger.verbose(`USDC Price: ${usdcPrice}`);
870
+ return outputUSDC * usdcPrice;
871
+ }
703
872
  async _getPriceEkubo(token, amountIn = new Web3Number(1, token.decimals), retry = 0) {
704
873
  logger.verbose(`Getting price of ${token.symbol} using Ekubo, amountIn: ${amountIn.toWei()}`);
705
874
  const url = this.EKUBO_API.replace("{{TOKEN_ADDRESS}}", token.address.toString()).replace("{{AMOUNT}}", amountIn.toWei());
@@ -719,7 +888,7 @@ var Pricer = class extends PricerBase {
719
888
  };
720
889
 
721
890
  // src/modules/pragma.ts
722
- var import_starknet2 = require("starknet");
891
+ var import_starknet5 = require("starknet");
723
892
 
724
893
  // src/data/pragma.abi.json
725
894
  var pragma_abi_default = [
@@ -823,7 +992,7 @@ var pragma_abi_default = [
823
992
  var Pragma = class {
824
993
  constructor(provider2) {
825
994
  this.contractAddr = "0x023fb3afbff2c0e3399f896dcf7400acf1a161941cfb386e34a123f228c62832";
826
- this.contract = new import_starknet2.Contract({ abi: pragma_abi_default, address: this.contractAddr, providerOrAccount: provider2 });
995
+ this.contract = new import_starknet5.Contract({ abi: pragma_abi_default, address: this.contractAddr, providerOrAccount: provider2 });
827
996
  }
828
997
  async getPrice(tokenAddr) {
829
998
  if (!tokenAddr) {
@@ -1066,7 +1235,7 @@ var PricerFromApi = class extends PricerBase {
1066
1235
  };
1067
1236
 
1068
1237
  // src/modules/erc20.ts
1069
- var import_starknet3 = require("starknet");
1238
+ var import_starknet6 = require("starknet");
1070
1239
 
1071
1240
  // src/data/erc20.abi.json
1072
1241
  var erc20_abi_default = [
@@ -2199,7 +2368,7 @@ var ERC20 = class {
2199
2368
  }
2200
2369
  contract(addr) {
2201
2370
  const _addr = typeof addr === "string" ? addr : addr.address;
2202
- return new import_starknet3.Contract({ abi: erc20_abi_default, address: _addr, providerOrAccount: this.config.provider });
2371
+ return new import_starknet6.Contract({ abi: erc20_abi_default, address: _addr, providerOrAccount: this.config.provider });
2203
2372
  }
2204
2373
  async balanceOf(token, address, tokenDecimals) {
2205
2374
  const contract = this.contract(token);
@@ -2213,150 +2382,6 @@ var ERC20 = class {
2213
2382
  }
2214
2383
  };
2215
2384
 
2216
- // src/modules/avnu.ts
2217
- var import_starknet6 = require("starknet");
2218
- var import_avnu_sdk = require("@avnu/avnu-sdk");
2219
-
2220
- // src/utils/oz-merkle.ts
2221
- var import_bytes = require("@ericnordelo/strk-merkle-tree/dist/bytes");
2222
- var import_core = require("@ericnordelo/strk-merkle-tree/dist/core");
2223
- var import_hashes = require("@ericnordelo/strk-merkle-tree/dist/hashes");
2224
- var import_merkletree = require("@ericnordelo/strk-merkle-tree/dist/merkletree");
2225
- var import_starknet4 = require("starknet");
2226
- var import_starknet5 = require("@scure/starknet");
2227
- function hash_leaf(leaf) {
2228
- if (leaf.data.length < 1) {
2229
- throw new Error("Invalid leaf data");
2230
- }
2231
- let firstElement = leaf.data[0];
2232
- let value = firstElement;
2233
- for (let i = 1; i < leaf.data.length; i++) {
2234
- value = pedersen_hash(value, leaf.data[i]);
2235
- }
2236
- return `0x${import_starknet4.num.toHexString(value).replace(/^0x/, "").padStart(64, "0")}`;
2237
- }
2238
- function pedersen_hash(a, b) {
2239
- return BigInt((0, import_starknet5.pedersen)(a, b).toString());
2240
- }
2241
- var StandardMerkleTree = class _StandardMerkleTree extends import_merkletree.MerkleTreeImpl {
2242
- constructor(tree, values, leafEncoding) {
2243
- super(tree, values, (leaf) => {
2244
- return hash_leaf(leaf);
2245
- });
2246
- this.tree = tree;
2247
- this.values = values;
2248
- this.leafEncoding = leafEncoding;
2249
- }
2250
- static of(values, leafEncoding = [], options = {}) {
2251
- const [tree, indexedValues] = import_merkletree.MerkleTreeImpl.prepare(values, options, (leaf) => {
2252
- return hash_leaf(leaf);
2253
- });
2254
- return new _StandardMerkleTree(tree, indexedValues, leafEncoding);
2255
- }
2256
- static verify(root, leafEncoding, leaf, proof) {
2257
- return (0, import_bytes.toHex)(root) === (0, import_core.processProof)((0, import_hashes.standardLeafHash)(leafEncoding, leaf), proof);
2258
- }
2259
- static verifyMultiProof(root, leafEncoding, multiproof) {
2260
- return (0, import_bytes.toHex)(root) === (0, import_core.processMultiProof)({
2261
- leaves: multiproof.leaves.map((leaf) => (0, import_hashes.standardLeafHash)(leafEncoding, leaf)),
2262
- proof: multiproof.proof,
2263
- proofFlags: multiproof.proofFlags
2264
- });
2265
- }
2266
- dump() {
2267
- return {
2268
- format: "standard-v1",
2269
- leafEncoding: this.leafEncoding,
2270
- tree: this.tree,
2271
- values: this.values
2272
- };
2273
- }
2274
- };
2275
-
2276
- // src/utils/index.ts
2277
- function assert(condition, message) {
2278
- if (!condition) {
2279
- throw new Error(message);
2280
- }
2281
- }
2282
- function getTrovesEndpoint() {
2283
- return process.env.TROVES_ENDPOINT || "https://app.troves.fi";
2284
- }
2285
-
2286
- // src/modules/avnu.ts
2287
- var AvnuWrapper = class {
2288
- async getQuotes(fromToken, toToken, amountWei, taker, retry = 0, excludeSources = ["Haiko(Solvers)"]) {
2289
- const MAX_RETRY = 5;
2290
- const params = {
2291
- sellTokenAddress: fromToken,
2292
- buyTokenAddress: toToken,
2293
- sellAmount: amountWei,
2294
- takerAddress: taker,
2295
- // excludeSources: ['Nostra', 'Haiko(Solvers)']
2296
- excludeSources
2297
- // excludeSources: ['Haiko(Solvers)'] // to resolve InvalidOraclePrice error
2298
- };
2299
- assert(fromToken != toToken, "From and to tokens are the same");
2300
- const quotes = await (0, import_avnu_sdk.fetchQuotes)(params);
2301
- const filteredQuotes = quotes.filter((q) => q.sellAmount.toString() == amountWei);
2302
- if (filteredQuotes.length == 0) {
2303
- if (retry < MAX_RETRY) {
2304
- await new Promise((res) => setTimeout(res, 3e3));
2305
- return await this.getQuotes(fromToken, toToken, amountWei, taker, retry + 1);
2306
- }
2307
- throw new Error("no quotes found");
2308
- }
2309
- return filteredQuotes[0];
2310
- }
2311
- async getSwapInfo(quote, taker, integratorFeeBps, integratorFeeRecipient, minAmount, options) {
2312
- const calldata = await (0, import_avnu_sdk.fetchBuildExecuteTransaction)(quote.quoteId, taker, void 0, void 0, options);
2313
- const call = calldata.calls[1];
2314
- const callData = call.calldata;
2315
- const routesLen = Number(callData[11]);
2316
- assert(routesLen > 0, "No routes found");
2317
- let startIndex = 12;
2318
- const routes = [];
2319
- for (let i = 0; i < routesLen; ++i) {
2320
- const swap_params_len = Number(callData[startIndex + 4]);
2321
- const route = {
2322
- token_from: callData[startIndex],
2323
- token_to: callData[startIndex + 1],
2324
- exchange_address: callData[startIndex + 2],
2325
- percent: Number(callData[startIndex + 3]),
2326
- additional_swap_params: swap_params_len > 0 ? callData.slice(startIndex + 5, startIndex + 5 + swap_params_len) : []
2327
- };
2328
- routes.push(route);
2329
- startIndex += 5 + swap_params_len;
2330
- }
2331
- const _minAmount = minAmount || (quote.buyAmount * 95n / 100n).toString();
2332
- const swapInfo = {
2333
- token_from_address: quote.sellTokenAddress,
2334
- token_from_amount: import_starknet6.uint256.bnToUint256(quote.sellAmount),
2335
- token_to_address: quote.buyTokenAddress,
2336
- token_to_amount: import_starknet6.uint256.bnToUint256(_minAmount),
2337
- token_to_min_amount: import_starknet6.uint256.bnToUint256(_minAmount),
2338
- beneficiary: taker,
2339
- integrator_fee_amount_bps: integratorFeeBps,
2340
- integrator_fee_recipient: integratorFeeRecipient,
2341
- routes
2342
- };
2343
- return swapInfo;
2344
- }
2345
- static buildZeroSwap(tokenToSell, beneficiary, tokenToBuy = tokenToSell) {
2346
- return {
2347
- token_from_address: tokenToSell.address,
2348
- token_from_amount: import_starknet6.uint256.bnToUint256(0),
2349
- token_to_address: tokenToBuy.address,
2350
- token_to_amount: import_starknet6.uint256.bnToUint256(0),
2351
- token_to_min_amount: import_starknet6.uint256.bnToUint256(0),
2352
- beneficiary,
2353
- integrator_fee_amount_bps: 0,
2354
- integrator_fee_recipient: beneficiary,
2355
- routes: []
2356
- };
2357
- }
2358
- };
2359
-
2360
2385
  // src/modules/ekubo-quoter.ts
2361
2386
  var import_axios5 = __toESM(require("axios"));
2362
2387
  var EkuboQuoter = class {
@@ -30552,8 +30577,8 @@ var usdcVaultSettings = {
30552
30577
  aumOracle: ContractAddr.from("0x6faf45ed185dec13ef723c9ead4266cab98d06f2cb237e331b1fa5c2aa79afe"),
30553
30578
  leafAdapters: [],
30554
30579
  adapters: [],
30555
- targetHealthFactor: 1.3,
30556
- minHealthFactor: 1.25
30580
+ targetHealthFactor: 1.25,
30581
+ minHealthFactor: 1.15
30557
30582
  };
30558
30583
  var wbtcVaultSettings = {
30559
30584
  vaultAddress: ContractAddr.from("0x5a4c1651b913aa2ea7afd9024911603152a19058624c3e425405370d62bf80c"),
@@ -30563,8 +30588,8 @@ var wbtcVaultSettings = {
30563
30588
  aumOracle: ContractAddr.from("0x2edf4edbed3f839e7f07dcd913e92299898ff4cf0ba532f8c572c66c5b331b2"),
30564
30589
  leafAdapters: [],
30565
30590
  adapters: [],
30566
- targetHealthFactor: 1.3,
30567
- minHealthFactor: 1.25
30591
+ targetHealthFactor: 1.2,
30592
+ minHealthFactor: 1.15
30568
30593
  };
30569
30594
  var ethVaultSettings = {
30570
30595
  vaultAddress: ContractAddr.from("0x446c22d4d3f5cb52b4950ba832ba1df99464c6673a37c092b1d9622650dbd8"),
@@ -30574,8 +30599,8 @@ var ethVaultSettings = {
30574
30599
  aumOracle: ContractAddr.from("0x4b747f2e75c057bed9aa2ce46fbdc2159dc684c15bd32d4f95983a6ecf39a05"),
30575
30600
  leafAdapters: [],
30576
30601
  adapters: [],
30577
- targetHealthFactor: 1.3,
30578
- minHealthFactor: 1.25
30602
+ targetHealthFactor: 1.25,
30603
+ minHealthFactor: 1.21
30579
30604
  };
30580
30605
  var strkVaultSettings = {
30581
30606
  vaultAddress: ContractAddr.from("0x55d012f57e58c96e0a5c7ebbe55853989d01e6538b15a95e7178aca4af05c21"),
@@ -30585,8 +30610,8 @@ var strkVaultSettings = {
30585
30610
  aumOracle: ContractAddr.from("0x6d7dbfad4bb51715da211468389a623da00c0625f8f6efbea822ee5ac5231f4"),
30586
30611
  leafAdapters: [],
30587
30612
  adapters: [],
30588
- targetHealthFactor: 1.3,
30589
- minHealthFactor: 1.25
30613
+ targetHealthFactor: 1.2,
30614
+ minHealthFactor: 1.15
30590
30615
  };
30591
30616
  var usdtVaultSettings = {
30592
30617
  vaultAddress: ContractAddr.from("0x1c4933d1880c6778585e597154eaca7b428579d72f3aae425ad2e4d26c6bb3"),
@@ -30596,8 +30621,8 @@ var usdtVaultSettings = {
30596
30621
  aumOracle: ContractAddr.from("0x7018f8040c8066a4ab929e6760ae52dd43b6a3a289172f514750a61fcc565cc"),
30597
30622
  leafAdapters: [],
30598
30623
  adapters: [],
30599
- targetHealthFactor: 1.3,
30600
- minHealthFactor: 1.25
30624
+ targetHealthFactor: 1.25,
30625
+ minHealthFactor: 1.15
30601
30626
  };
30602
30627
  function MetaVaultDescription(allowedSources) {
30603
30628
  const logos = {