@gearbox-protocol/sdk 11.6.8 → 11.7.1

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.
@@ -102,7 +102,7 @@ class GearboxSDK {
102
102
  /**
103
103
  * Token metadata such as symbol and decimals
104
104
  */
105
- tokensMeta = new import_base.TokensMeta(void 0, "tokensMeta");
105
+ tokensMeta;
106
106
  addHook = this.#hooks.addHook.bind(this.#hooks);
107
107
  removeHook = this.#hooks.removeHook.bind(this.#hooks);
108
108
  static async attach(options) {
@@ -165,6 +165,7 @@ class GearboxSDK {
165
165
  if (options.gasLimit !== null) {
166
166
  this.gasLimit = options.gasLimit || 550000000n;
167
167
  }
168
+ this.tokensMeta = new import_base.TokensMeta(this);
168
169
  }
169
170
  async #attach(opts) {
170
171
  const {
@@ -21,14 +21,45 @@ __export(TokensMeta_exports, {
21
21
  TokensMeta: () => TokensMeta
22
22
  });
23
23
  module.exports = __toCommonJS(TokensMeta_exports);
24
+ var import_iVersion = require("../../abi/iVersion.js");
25
+ var import__ = require("../index.js");
24
26
  var import_utils = require("../utils/index.js");
25
27
  class TokensMeta extends import_utils.AddressMap {
28
+ #sdk;
29
+ #phantomTokensLoaded;
30
+ constructor(sdk) {
31
+ super(void 0, "tokensMeta");
32
+ this.#sdk = sdk;
33
+ }
26
34
  symbol(token) {
27
35
  return this.mustGet(token).symbol;
28
36
  }
29
37
  decimals(token) {
30
38
  return this.mustGet(token).decimals;
31
39
  }
40
+ /**
41
+ * Returns the phantom token type for a given token, or undefined for normal tokens
42
+ * Throws if the phantom token data is not loaded
43
+ */
44
+ phantomTokenType(token) {
45
+ if (!this.#phantomTokensLoaded?.has(token)) {
46
+ throw new Error("phantom token data not loaded");
47
+ }
48
+ return this.mustGet(token).phantomTokenType;
49
+ }
50
+ /**
51
+ * Returns a map of all phantom tokens
52
+ * Throws if the phantom token data is not loaded
53
+ */
54
+ get phantomTokens() {
55
+ if (!this.#phantomTokensLoaded) {
56
+ throw new Error("phantom tokens not loaded");
57
+ }
58
+ return new import_utils.AddressMap(
59
+ this.entries().filter(([_, v]) => !!v.phantomTokenType),
60
+ "phantomTokens"
61
+ );
62
+ }
32
63
  formatBN(arg0, arg1, arg2) {
33
64
  const token = typeof arg0 === "object" ? arg0.token : arg0;
34
65
  const amount = typeof arg0 === "object" ? arg0.balance : arg1;
@@ -47,6 +78,32 @@ class TokensMeta extends import_utils.AddressMap {
47
78
  }
48
79
  return meta;
49
80
  }
81
+ /**
82
+ * Loads phantom token data for all known tokens from chain
83
+ */
84
+ async loadPhantomTokens() {
85
+ this.#phantomTokensLoaded = new import_utils.AddressSet();
86
+ const tokens = this.keys();
87
+ const resp = await this.#sdk.client.multicall({
88
+ contracts: tokens.map(
89
+ (t) => ({
90
+ address: t,
91
+ abi: import_iVersion.iVersionAbi,
92
+ functionName: "contractType"
93
+ })
94
+ ),
95
+ allowFailure: true
96
+ });
97
+ for (let i = 0; i < resp.length; i++) {
98
+ if (resp[i].status === "success") {
99
+ const contractType = (0, import__.bytes32ToString)(resp[i].result);
100
+ if (contractType.startsWith("PHANTOM_TOKEN::")) {
101
+ this.mustGet(tokens[i]).phantomTokenType = contractType;
102
+ }
103
+ }
104
+ this.#phantomTokensLoaded.add(tokens[i]);
105
+ }
106
+ }
50
107
  }
51
108
  // Annotate the CommonJS export names for ESM import in node:
52
109
  0 && (module.exports = {
@@ -21,6 +21,7 @@ __reExport(constants_exports, require("./bot-permissions.js"), module.exports);
21
21
  __reExport(constants_exports, require("./math.js"), module.exports);
22
22
  __reExport(constants_exports, require("./networks.js"), module.exports);
23
23
  __reExport(constants_exports, require("./periphery.js"), module.exports);
24
+ __reExport(constants_exports, require("./phantom-tokens.js"), module.exports);
24
25
  __reExport(constants_exports, require("./versions.js"), module.exports);
25
26
  // Annotate the CommonJS export names for ESM import in node:
26
27
  0 && (module.exports = {
@@ -30,5 +31,6 @@ __reExport(constants_exports, require("./versions.js"), module.exports);
30
31
  ...require("./math.js"),
31
32
  ...require("./networks.js"),
32
33
  ...require("./periphery.js"),
34
+ ...require("./phantom-tokens.js"),
33
35
  ...require("./versions.js")
34
36
  });
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var phantom_tokens_exports = {};
20
+ __export(phantom_tokens_exports, {
21
+ PHANTOM_TOKEN_CONTRACT_TYPES: () => PHANTOM_TOKEN_CONTRACT_TYPES
22
+ });
23
+ module.exports = __toCommonJS(phantom_tokens_exports);
24
+ const PHANTOM_TOKEN_CONTRACT_TYPES = [
25
+ "PHANTOM_TOKEN::CONVEX",
26
+ "PHANTOM_TOKEN::INFINIFI_UNWIND",
27
+ "PHANTOM_TOKEN::INFRARED",
28
+ "PHANTOM_TOKEN::MELLOW_WITHDRAWAL",
29
+ "PHANTOM_TOKEN::MIDAS_REDEMPTION",
30
+ "PHANTOM_TOKEN::STAKING_REWARDS",
31
+ "PHANTOM_TOKEN::UPSHIFT_WITHDRAW"
32
+ ];
33
+ // Annotate the CommonJS export names for ESM import in node:
34
+ 0 && (module.exports = {
35
+ PHANTOM_TOKEN_CONTRACT_TYPES
36
+ });
@@ -18,7 +18,6 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var normal_exports = {};
20
20
  __export(normal_exports, {
21
- isNormalToken: () => isNormalToken,
22
21
  normalTokens: () => normalTokens
23
22
  });
24
23
  module.exports = __toCommonJS(normal_exports);
@@ -557,9 +556,7 @@ const normalTokens = {
557
556
  type: { AllNetworks: import_tokenType.TokenType.NORMAL_TOKEN }
558
557
  }
559
558
  };
560
- const isNormalToken = (t) => typeof t === "string" && !!normalTokens[t];
561
559
  // Annotate the CommonJS export names for ESM import in node:
562
560
  0 && (module.exports = {
563
- isNormalToken,
564
561
  normalTokens
565
562
  });
@@ -3,10 +3,6 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
6
  var __copyProps = (to, from, except, desc) => {
11
7
  if (from && typeof from === "object" || typeof from === "function") {
12
8
  for (let key of __getOwnPropNames(from))
@@ -17,24 +13,4 @@ var __copyProps = (to, from, except, desc) => {
17
13
  };
18
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
15
  var wrapped_exports = {};
20
- __export(wrapped_exports, {
21
- isWrappedToken: () => isWrappedToken
22
- });
23
16
  module.exports = __toCommonJS(wrapped_exports);
24
- var import_tokenType = require("./tokenType.js");
25
- const wrappedTokens = {
26
- sfrxETH: {
27
- name: "sfrxETH",
28
- symbol: "sfrxETH",
29
- type: {
30
- Mainnet: import_tokenType.TokenType.WRAPPED_TOKEN,
31
- Arbitrum: import_tokenType.TokenType.NORMAL_TOKEN,
32
- Optimism: import_tokenType.TokenType.NORMAL_TOKEN
33
- }
34
- }
35
- };
36
- const isWrappedToken = (t) => typeof t === "string" && !!wrappedTokens[t];
37
- // Annotate the CommonJS export names for ESM import in node:
38
- 0 && (module.exports = {
39
- isWrappedToken
40
- });
@@ -15,25 +15,29 @@ const tokenDataList = {
15
15
  addr: WETH,
16
16
  decimals: 18,
17
17
  symbol: "WETH",
18
- name: ""
18
+ name: "",
19
+ isPhantom: false
19
20
  }),
20
21
  [DAI]: new import_tokenData.TokenData({
21
22
  addr: DAI,
22
23
  decimals: 18,
23
24
  symbol: "DAI",
24
- name: ""
25
+ name: "",
26
+ isPhantom: false
25
27
  }),
26
28
  [USDC]: new import_tokenData.TokenData({
27
29
  addr: USDC,
28
30
  decimals: 6,
29
31
  symbol: "USDC",
30
- name: ""
32
+ name: "",
33
+ isPhantom: false
31
34
  }),
32
35
  [STETH]: new import_tokenData.TokenData({
33
36
  addr: STETH,
34
37
  decimals: 18,
35
38
  symbol: "STETH",
36
- name: ""
39
+ name: "",
40
+ isPhantom: false
37
41
  })
38
42
  };
39
43
  const prices = {
@@ -69,6 +69,7 @@ class TokenData {
69
69
  name;
70
70
  decimals;
71
71
  icon;
72
+ isPhantom;
72
73
  constructor(payload) {
73
74
  const address = payload.addr.toLowerCase();
74
75
  this.address = address;
@@ -77,6 +78,7 @@ class TokenData {
77
78
  this.name = payload.name;
78
79
  this.decimals = payload.decimals;
79
80
  this.icon = TokenData.getTokenIcon(payload.symbol);
81
+ this.isPhantom = payload.isPhantom ?? false;
80
82
  }
81
83
  static getTokenIcon(symbol) {
82
84
  return `${import_endpoint.GearboxBackendApi.getStaticTokenUrl()}${symbol.toLowerCase()}.svg`;
@@ -101,7 +101,7 @@ class GearboxSDK {
101
101
  /**
102
102
  * Token metadata such as symbol and decimals
103
103
  */
104
- tokensMeta = new TokensMeta(void 0, "tokensMeta");
104
+ tokensMeta;
105
105
  addHook = this.#hooks.addHook.bind(this.#hooks);
106
106
  removeHook = this.#hooks.removeHook.bind(this.#hooks);
107
107
  static async attach(options) {
@@ -164,6 +164,7 @@ class GearboxSDK {
164
164
  if (options.gasLimit !== null) {
165
165
  this.gasLimit = options.gasLimit || 550000000n;
166
166
  }
167
+ this.tokensMeta = new TokensMeta(this);
167
168
  }
168
169
  async #attach(opts) {
169
170
  const {
@@ -1,11 +1,42 @@
1
- import { AddressMap, formatBN } from "../utils/index.js";
1
+ import { iVersionAbi } from "../../abi/iVersion.js";
2
+ import { bytes32ToString } from "../index.js";
3
+ import { AddressMap, AddressSet, formatBN } from "../utils/index.js";
2
4
  class TokensMeta extends AddressMap {
5
+ #sdk;
6
+ #phantomTokensLoaded;
7
+ constructor(sdk) {
8
+ super(void 0, "tokensMeta");
9
+ this.#sdk = sdk;
10
+ }
3
11
  symbol(token) {
4
12
  return this.mustGet(token).symbol;
5
13
  }
6
14
  decimals(token) {
7
15
  return this.mustGet(token).decimals;
8
16
  }
17
+ /**
18
+ * Returns the phantom token type for a given token, or undefined for normal tokens
19
+ * Throws if the phantom token data is not loaded
20
+ */
21
+ phantomTokenType(token) {
22
+ if (!this.#phantomTokensLoaded?.has(token)) {
23
+ throw new Error("phantom token data not loaded");
24
+ }
25
+ return this.mustGet(token).phantomTokenType;
26
+ }
27
+ /**
28
+ * Returns a map of all phantom tokens
29
+ * Throws if the phantom token data is not loaded
30
+ */
31
+ get phantomTokens() {
32
+ if (!this.#phantomTokensLoaded) {
33
+ throw new Error("phantom tokens not loaded");
34
+ }
35
+ return new AddressMap(
36
+ this.entries().filter(([_, v]) => !!v.phantomTokenType),
37
+ "phantomTokens"
38
+ );
39
+ }
9
40
  formatBN(arg0, arg1, arg2) {
10
41
  const token = typeof arg0 === "object" ? arg0.token : arg0;
11
42
  const amount = typeof arg0 === "object" ? arg0.balance : arg1;
@@ -24,6 +55,32 @@ class TokensMeta extends AddressMap {
24
55
  }
25
56
  return meta;
26
57
  }
58
+ /**
59
+ * Loads phantom token data for all known tokens from chain
60
+ */
61
+ async loadPhantomTokens() {
62
+ this.#phantomTokensLoaded = new AddressSet();
63
+ const tokens = this.keys();
64
+ const resp = await this.#sdk.client.multicall({
65
+ contracts: tokens.map(
66
+ (t) => ({
67
+ address: t,
68
+ abi: iVersionAbi,
69
+ functionName: "contractType"
70
+ })
71
+ ),
72
+ allowFailure: true
73
+ });
74
+ for (let i = 0; i < resp.length; i++) {
75
+ if (resp[i].status === "success") {
76
+ const contractType = bytes32ToString(resp[i].result);
77
+ if (contractType.startsWith("PHANTOM_TOKEN::")) {
78
+ this.mustGet(tokens[i]).phantomTokenType = contractType;
79
+ }
80
+ }
81
+ this.#phantomTokensLoaded.add(tokens[i]);
82
+ }
83
+ }
27
84
  }
28
85
  export {
29
86
  TokensMeta
@@ -4,4 +4,5 @@ export * from "./bot-permissions.js";
4
4
  export * from "./math.js";
5
5
  export * from "./networks.js";
6
6
  export * from "./periphery.js";
7
+ export * from "./phantom-tokens.js";
7
8
  export * from "./versions.js";
@@ -0,0 +1,12 @@
1
+ const PHANTOM_TOKEN_CONTRACT_TYPES = [
2
+ "PHANTOM_TOKEN::CONVEX",
3
+ "PHANTOM_TOKEN::INFINIFI_UNWIND",
4
+ "PHANTOM_TOKEN::INFRARED",
5
+ "PHANTOM_TOKEN::MELLOW_WITHDRAWAL",
6
+ "PHANTOM_TOKEN::MIDAS_REDEMPTION",
7
+ "PHANTOM_TOKEN::STAKING_REWARDS",
8
+ "PHANTOM_TOKEN::UPSHIFT_WITHDRAW"
9
+ ];
10
+ export {
11
+ PHANTOM_TOKEN_CONTRACT_TYPES
12
+ };
@@ -533,8 +533,6 @@ const normalTokens = {
533
533
  type: { AllNetworks: TokenType.NORMAL_TOKEN }
534
534
  }
535
535
  };
536
- const isNormalToken = (t) => typeof t === "string" && !!normalTokens[t];
537
536
  export {
538
- isNormalToken,
539
537
  normalTokens
540
538
  };
@@ -1,16 +0,0 @@
1
- import { TokenType } from "./tokenType.js";
2
- const wrappedTokens = {
3
- sfrxETH: {
4
- name: "sfrxETH",
5
- symbol: "sfrxETH",
6
- type: {
7
- Mainnet: TokenType.WRAPPED_TOKEN,
8
- Arbitrum: TokenType.NORMAL_TOKEN,
9
- Optimism: TokenType.NORMAL_TOKEN
10
- }
11
- }
12
- };
13
- const isWrappedToken = (t) => typeof t === "string" && !!wrappedTokens[t];
14
- export {
15
- isWrappedToken
16
- };
@@ -18,25 +18,29 @@ const tokenDataList = {
18
18
  addr: WETH,
19
19
  decimals: 18,
20
20
  symbol: "WETH",
21
- name: ""
21
+ name: "",
22
+ isPhantom: false
22
23
  }),
23
24
  [DAI]: new TokenData({
24
25
  addr: DAI,
25
26
  decimals: 18,
26
27
  symbol: "DAI",
27
- name: ""
28
+ name: "",
29
+ isPhantom: false
28
30
  }),
29
31
  [USDC]: new TokenData({
30
32
  addr: USDC,
31
33
  decimals: 6,
32
34
  symbol: "USDC",
33
- name: ""
35
+ name: "",
36
+ isPhantom: false
34
37
  }),
35
38
  [STETH]: new TokenData({
36
39
  addr: STETH,
37
40
  decimals: 18,
38
41
  symbol: "STETH",
39
- name: ""
42
+ name: "",
43
+ isPhantom: false
40
44
  })
41
45
  };
42
46
  const prices = {
@@ -46,6 +46,7 @@ class TokenData {
46
46
  name;
47
47
  decimals;
48
48
  icon;
49
+ isPhantom;
49
50
  constructor(payload) {
50
51
  const address = payload.addr.toLowerCase();
51
52
  this.address = address;
@@ -54,6 +55,7 @@ class TokenData {
54
55
  this.name = payload.name;
55
56
  this.decimals = payload.decimals;
56
57
  this.icon = TokenData.getTokenIcon(payload.symbol);
58
+ this.isPhantom = payload.isPhantom ?? false;
57
59
  }
58
60
  static getTokenIcon(symbol) {
59
61
  return `${GearboxBackendApi.getStaticTokenUrl()}${symbol.toLowerCase()}.svg`;
@@ -1,5 +1,5 @@
1
1
  import { type Address, type PublicClient } from "viem";
2
- export declare function getPrices({ client, priceFeeds, chunkSize, gasLimit }: {
2
+ export declare function getPrices({ client, priceFeeds, chunkSize, gasLimit, }: {
3
3
  client: PublicClient;
4
4
  priceFeeds: Address[];
5
5
  chunkSize?: number;
@@ -1,4 +1,6 @@
1
1
  import type { Address } from "viem";
2
+ import type { GearboxSDK } from "../GearboxSDK.js";
3
+ import { type PhantomTokenContractType } from "../index.js";
2
4
  import type { Asset } from "../router/index.js";
3
5
  import { AddressMap } from "../utils/index.js";
4
6
  import type { TokenMetaData } from "./types.js";
@@ -6,11 +8,33 @@ export interface FormatBNOptions {
6
8
  precision?: number;
7
9
  symbol?: boolean;
8
10
  }
9
- export declare class TokensMeta extends AddressMap<TokenMetaData> {
11
+ export interface TokenMetaDataExtended extends TokenMetaData {
12
+ /**
13
+ * Undefined if token is not a phantom token
14
+ */
15
+ phantomTokenType?: PhantomTokenContractType;
16
+ }
17
+ export declare class TokensMeta extends AddressMap<TokenMetaDataExtended> {
18
+ #private;
19
+ constructor(sdk: GearboxSDK);
10
20
  symbol(token: Address): string;
11
21
  decimals(token: Address): number;
22
+ /**
23
+ * Returns the phantom token type for a given token, or undefined for normal tokens
24
+ * Throws if the phantom token data is not loaded
25
+ */
26
+ phantomTokenType(token: Address): PhantomTokenContractType | undefined;
27
+ /**
28
+ * Returns a map of all phantom tokens
29
+ * Throws if the phantom token data is not loaded
30
+ */
31
+ get phantomTokens(): AddressMap<TokenMetaDataExtended>;
12
32
  formatBN(asset: Asset, options?: FormatBNOptions): string;
13
33
  formatBN(token: Address, amount: number | bigint | string | undefined, options?: FormatBNOptions): string;
14
34
  findBySymbol(symbol: string): TokenMetaData | undefined;
15
35
  mustFindBySymbol(symbol: string): TokenMetaData;
36
+ /**
37
+ * Loads phantom token data for all known tokens from chain
38
+ */
39
+ loadPhantomTokens(): Promise<void>;
16
40
  }
@@ -4,4 +4,5 @@ export * from "./bot-permissions.js";
4
4
  export * from "./math.js";
5
5
  export * from "./networks.js";
6
6
  export * from "./periphery.js";
7
+ export * from "./phantom-tokens.js";
7
8
  export * from "./versions.js";
@@ -0,0 +1,2 @@
1
+ export declare const PHANTOM_TOKEN_CONTRACT_TYPES: readonly ["PHANTOM_TOKEN::CONVEX", "PHANTOM_TOKEN::INFINIFI_UNWIND", "PHANTOM_TOKEN::INFRARED", "PHANTOM_TOKEN::MELLOW_WITHDRAWAL", "PHANTOM_TOKEN::MIDAS_REDEMPTION", "PHANTOM_TOKEN::STAKING_REWARDS", "PHANTOM_TOKEN::UPSHIFT_WITHDRAW"];
2
+ export type PhantomTokenContractType = (typeof PHANTOM_TOKEN_CONTRACT_TYPES)[number];
@@ -7,4 +7,3 @@ export type NormalTokenData = {
7
7
  type: Partial<Record<TokenNetwork, TokenType.NORMAL_TOKEN>>;
8
8
  } & TokenBase;
9
9
  export declare const normalTokens: Record<NormalToken, NormalTokenData>;
10
- export declare const isNormalToken: (t: unknown) => t is NormalToken;
@@ -1,9 +1,7 @@
1
1
  import type { TokenBase } from "./token.js";
2
- import type { TokenNetwork } from "./tokenType.js";
3
- import { TokenType } from "./tokenType.js";
2
+ import type { TokenNetwork, TokenType } from "./tokenType.js";
4
3
  export type WrappedToken = "sfrxETH";
5
4
  export type WrappedTokenData = {
6
5
  symbol: WrappedToken;
7
6
  type: Partial<Record<TokenNetwork, TokenType.WRAPPED_TOKEN | TokenType.NORMAL_TOKEN>>;
8
7
  } & TokenBase;
9
- export declare const isWrappedToken: (t: unknown) => t is WrappedToken;
@@ -6,6 +6,7 @@ export interface TokenDataPayload {
6
6
  title?: string;
7
7
  name: string;
8
8
  decimals: number;
9
+ isPhantom: boolean;
9
10
  }
10
11
  export declare class TokenData {
11
12
  readonly address: Address;
@@ -14,6 +15,7 @@ export declare class TokenData {
14
15
  readonly name: string;
15
16
  readonly decimals: number;
16
17
  readonly icon: string;
18
+ readonly isPhantom: boolean;
17
19
  constructor(payload: TokenDataPayload);
18
20
  static getTokenIcon(symbol: string): string;
19
21
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gearbox-protocol/sdk",
3
- "version": "11.6.8",
3
+ "version": "11.7.1",
4
4
  "description": "Gearbox SDK",
5
5
  "license": "MIT",
6
6
  "main": "./dist/cjs/sdk/index.js",