@shapeshiftoss/swapper 5.2.2 → 5.4.0

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/api.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AssetId } from '@shapeshiftoss/caip';
2
- import { HDWallet } from '@shapeshiftoss/hdwallet-core';
2
+ import { BTCSignTx, ETHSignTx, HDWallet } from '@shapeshiftoss/hdwallet-core';
3
3
  import { Asset, ChainSpecific, SupportedChainIds } from '@shapeshiftoss/types';
4
4
  export declare const SwapError: {
5
5
  new <V extends {
@@ -85,6 +85,15 @@ export interface ZrxTrade<C extends SupportedChainIds> extends Trade<C> {
85
85
  txData: string;
86
86
  depositAddress: string;
87
87
  }
88
+ export interface BtcThorTrade<C extends SupportedChainIds> extends Trade<C> {
89
+ chainId: 'bip122:000000000019d6689c085ae165831e93';
90
+ txData: BTCSignTx;
91
+ }
92
+ export interface EthThorTrade<C extends SupportedChainIds> extends Trade<C> {
93
+ chainId: 'eip155:1';
94
+ txData: ETHSignTx;
95
+ }
96
+ export declare type ThorTrade<C extends SupportedChainIds> = BtcThorTrade<C> | EthThorTrade<C>;
88
97
  export declare type ExecuteTradeInput<C extends SupportedChainIds> = {
89
98
  trade: Trade<C>;
90
99
  wallet: HDWallet;
@@ -133,6 +142,7 @@ export declare enum SwapErrorTypes {
133
142
  CHECK_APPROVAL_FAILED = "CHECK_APPROVAL_FAILED",
134
143
  EXECUTE_TRADE_FAILED = "EXECUTE_TRADE_FAILED",
135
144
  GRANT_ALLOWANCE_FAILED = "GRANT_ALLOWANCE_FAILED",
145
+ INITIALIZE_FAILED = "INITIALIZE_FAILED",
136
146
  MANAGER_ERROR = "MANAGER_ERROR",
137
147
  MIN_MAX_FAILED = "MIN_MAX_FAILED",
138
148
  RESPONSE_ERROR = "RESPONSE_ERROR",
@@ -141,7 +151,8 @@ export declare enum SwapErrorTypes {
141
151
  UNSUPPORTED_PAIR = "UNSUPPORTED_PAIR",
142
152
  USD_RATE_FAILED = "USD_RATE_FAILED",
143
153
  UNSUPPORTED_CHAIN = "UNSUPPORTED_CHAIN",
144
- VALIDATION_FAILED = "VALIDATION_FAILED"
154
+ VALIDATION_FAILED = "VALIDATION_FAILED",
155
+ MAKE_MEMO_FAILED = "MAKE_MEMO_FAILED"
145
156
  }
146
157
  export interface Swapper {
147
158
  /** perform any necessary async initialization */
package/dist/api.js CHANGED
@@ -18,6 +18,7 @@ var SwapErrorTypes;
18
18
  SwapErrorTypes["CHECK_APPROVAL_FAILED"] = "CHECK_APPROVAL_FAILED";
19
19
  SwapErrorTypes["EXECUTE_TRADE_FAILED"] = "EXECUTE_TRADE_FAILED";
20
20
  SwapErrorTypes["GRANT_ALLOWANCE_FAILED"] = "GRANT_ALLOWANCE_FAILED";
21
+ SwapErrorTypes["INITIALIZE_FAILED"] = "INITIALIZE_FAILED";
21
22
  SwapErrorTypes["MANAGER_ERROR"] = "MANAGER_ERROR";
22
23
  SwapErrorTypes["MIN_MAX_FAILED"] = "MIN_MAX_FAILED";
23
24
  SwapErrorTypes["RESPONSE_ERROR"] = "RESPONSE_ERROR";
@@ -27,4 +28,5 @@ var SwapErrorTypes;
27
28
  SwapErrorTypes["USD_RATE_FAILED"] = "USD_RATE_FAILED";
28
29
  SwapErrorTypes["UNSUPPORTED_CHAIN"] = "UNSUPPORTED_CHAIN";
29
30
  SwapErrorTypes["VALIDATION_FAILED"] = "VALIDATION_FAILED";
31
+ SwapErrorTypes["MAKE_MEMO_FAILED"] = "MAKE_MEMO_FAILED";
30
32
  })(SwapErrorTypes = exports.SwapErrorTypes || (exports.SwapErrorTypes = {}));
@@ -13,6 +13,7 @@ const readline_sync_1 = __importDefault(require("readline-sync"));
13
13
  const web3_1 = __importDefault(require("web3"));
14
14
  const api_1 = require("./api");
15
15
  const SwapperManager_1 = require("./manager/SwapperManager");
16
+ const ThorchainSwapper_1 = require("./swappers/thorchain/ThorchainSwapper");
16
17
  const ZrxSwapper_1 = require("./swappers/zrx/ZrxSwapper");
17
18
  dotenv_1.default.config();
18
19
  const { UNCHAINED_HTTP_API = 'http://localhost:31300', UNCHAINED_WS_API = 'wss://localhost:31300', ETH_NODE_URL = 'http://localhost:3000', DEVICE_ID = 'device123', MNEMONIC = 'all all all all all all all all all all all all' } = process.env;
@@ -82,9 +83,15 @@ const main = async () => {
82
83
  const web3Provider = new web3_1.default.providers.HttpProvider(ETH_NODE_URL);
83
84
  const web3 = new web3_1.default(web3Provider);
84
85
  const zrxSwapperDeps = { wallet, adapterManager, web3 };
86
+ const thorchainSwapperDeps = {
87
+ midgardUrl: 'https://midgard.thorchain.info/v2/pools'
88
+ };
85
89
  const manager = new SwapperManager_1.SwapperManager();
86
90
  const zrxSwapper = new ZrxSwapper_1.ZrxSwapper(zrxSwapperDeps);
91
+ const thorchainSwapper = new ThorchainSwapper_1.ThorchainSwapper(thorchainSwapperDeps);
92
+ await thorchainSwapper.initialize();
87
93
  manager.addSwapper(api_1.SwapperType.Zrx, zrxSwapper);
94
+ manager.addSwapper(api_1.SwapperType.Thorchain, thorchainSwapper);
88
95
  const swapper = await manager.getBestSwapper({
89
96
  sellAssetId: 'eip155:1/slip44:60',
90
97
  buyAssetId: 'eip155:1/erc20:0xc770eefad204b5180df6a14ee197d99d808ee52d'
@@ -9,7 +9,7 @@ const api_1 = require("../../api");
9
9
  class TestSwapper {
10
10
  constructor() {
11
11
  this.supportAssets = [
12
- 'bip122:000000000933ea01ad0ee984209779ba/slip44:0',
12
+ 'bip122:000000000019d6689c085ae165831e93/slip44:0',
13
13
  'cosmos:cosmoshub-4/slip44:118',
14
14
  'eip155:1/erc20:0xc770eefad204b5180df6a14ee197d99d808ee52d'
15
15
  ];
@@ -1,14 +1,20 @@
1
1
  import { AssetId } from '@shapeshiftoss/caip';
2
2
  import { Asset, SupportedChainIds } from '@shapeshiftoss/types';
3
- import { ApprovalNeededOutput, GetMinMaxInput, MinMaxOutput, Swapper, SwapperType, Trade, TradeQuote, TradeResult, TradeTxs } from '../../api';
3
+ import { ApprovalNeededOutput, BuyAssetBySellIdInput, GetMinMaxInput, MinMaxOutput, Swapper, SwapperType, Trade, TradeQuote, TradeResult, TradeTxs } from '../../api';
4
+ export declare type ThorchainSwapperDeps = {
5
+ midgardUrl: string;
6
+ };
4
7
  export declare class ThorchainSwapper implements Swapper {
5
- getType(): SwapperType;
8
+ private supportedAssetIds;
9
+ deps: ThorchainSwapperDeps;
10
+ constructor(deps: ThorchainSwapperDeps);
6
11
  initialize(): Promise<void>;
12
+ getType(): SwapperType;
7
13
  getUsdRate(input: Pick<Asset, 'symbol' | 'assetId'>): Promise<string>;
8
14
  getMinMax(input: GetMinMaxInput): Promise<MinMaxOutput>;
9
15
  approvalNeeded(): Promise<ApprovalNeededOutput>;
10
16
  approveInfinite(): Promise<string>;
11
- filterBuyAssetsBySellAssetId(): AssetId[];
17
+ filterBuyAssetsBySellAssetId(args: BuyAssetBySellIdInput): AssetId[];
12
18
  filterAssetIdsBySellable(): AssetId[];
13
19
  buildTrade(): Promise<Trade<SupportedChainIds>>;
14
20
  getTradeQuote(): Promise<TradeQuote<SupportedChainIds>>;
@@ -1,14 +1,39 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.ThorchainSwapper = void 0;
7
+ const caip_1 = require("@shapeshiftoss/caip");
8
+ const axios_1 = __importDefault(require("axios"));
4
9
  const api_1 = require("../../api");
5
10
  class ThorchainSwapper {
11
+ constructor(deps) {
12
+ this.supportedAssetIds = [];
13
+ this.deps = deps;
14
+ }
15
+ async initialize() {
16
+ try {
17
+ const { data: responseData } = await axios_1.default.get(this.deps.midgardUrl);
18
+ const supportedAssetIds = responseData.reduce((acc, midgardPool) => {
19
+ const assetId = caip_1.adapters.poolAssetIdToAssetId(midgardPool.asset);
20
+ if (!assetId)
21
+ return acc;
22
+ acc.push(assetId);
23
+ return acc;
24
+ }, []);
25
+ this.supportedAssetIds = supportedAssetIds;
26
+ }
27
+ catch (e) {
28
+ throw new api_1.SwapError('[thorchainInitialize]: initialize failed to set supportedAssetIds', {
29
+ code: api_1.SwapErrorTypes.INITIALIZE_FAILED,
30
+ cause: e
31
+ });
32
+ }
33
+ }
6
34
  getType() {
7
35
  return api_1.SwapperType.Thorchain;
8
36
  }
9
- // TODO populate supported assets from midgard
10
- // eslint-disable-next-line @typescript-eslint/no-empty-function
11
- async initialize() { }
12
37
  getUsdRate(input) {
13
38
  console.info(input);
14
39
  throw new Error('ThorchainSwapper: getUsdRate unimplemented');
@@ -23,11 +48,12 @@ class ThorchainSwapper {
23
48
  async approveInfinite() {
24
49
  throw new Error('ThorchainSwapper: approveInfinite unimplemented');
25
50
  }
26
- filterBuyAssetsBySellAssetId() {
27
- return [];
51
+ filterBuyAssetsBySellAssetId(args) {
52
+ const { assetIds = [], sellAssetId } = args;
53
+ return assetIds.filter((assetId) => this.supportedAssetIds.includes(assetId) && assetId !== sellAssetId);
28
54
  }
29
55
  filterAssetIdsBySellable() {
30
- return [];
56
+ return this.supportedAssetIds;
31
57
  }
32
58
  async buildTrade() {
33
59
  throw new Error('ThorchainSwapper: buildTrade unimplemented');
@@ -0,0 +1,14 @@
1
+ export declare type MidgardResponse = {
2
+ asset: string;
3
+ assetDepth: string;
4
+ assetPrice: string;
5
+ assetPriceUSD: string;
6
+ liquidityUnits: string;
7
+ poolAPY: string;
8
+ runeDepth: string;
9
+ status: string;
10
+ synthSupply: string;
11
+ synthUnits: string;
12
+ units: string;
13
+ volume24h: string;
14
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @returns thorchain memo shortened to a max of 80 characters as described:
3
+ * https://dev.thorchain.org/thorchain-dev/memos#mechanism-for-transaction-intent
4
+ */
5
+ export declare const makeSwapMemo: ({ buyAssetId, destinationAddress, limit }: {
6
+ buyAssetId: string;
7
+ destinationAddress: string;
8
+ limit: string;
9
+ }) => string;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeSwapMemo = void 0;
4
+ const caip_1 = require("@shapeshiftoss/caip");
5
+ const api_1 = require("../../../api");
6
+ // BTC (and likely other utxo coins) can only support up to 80 character memos
7
+ const MAX_LENGTH = 80;
8
+ /**
9
+ * @returns thorchain memo shortened to a max of 80 characters as described:
10
+ * https://dev.thorchain.org/thorchain-dev/memos#mechanism-for-transaction-intent
11
+ */
12
+ const makeSwapMemo = ({ buyAssetId, destinationAddress, limit }) => {
13
+ const thorId = caip_1.adapters.assetIdToPoolAssetId({ assetId: buyAssetId });
14
+ if (!thorId)
15
+ throw new api_1.SwapError('[makeSwapMemo] - undefined thorId for given buyAssetId', {
16
+ code: api_1.SwapErrorTypes.MAKE_MEMO_FAILED,
17
+ details: { buyAssetId }
18
+ });
19
+ const memo = `s:${thorId}:${destinationAddress}:${limit}`;
20
+ if (memo.length <= MAX_LENGTH)
21
+ return memo;
22
+ const abbreviationAmount = memo.length - MAX_LENGTH;
23
+ if (abbreviationAmount > 39)
24
+ throw new api_1.SwapError('[makeSwapMemo] - too much abbreviation for accurate matching', {
25
+ code: api_1.SwapErrorTypes.MAKE_MEMO_FAILED
26
+ });
27
+ // delimeter between ticker and id allowing us to abbreviate the id: https://dev.thorchain.org/thorchain-dev/memos#asset-notation
28
+ const delimeterIndex = memo.indexOf('-') + 1;
29
+ if (!delimeterIndex) {
30
+ throw new api_1.SwapError('[makeSwapMemo] - unable to abbreviate asset, no delimeter found', {
31
+ code: api_1.SwapErrorTypes.MAKE_MEMO_FAILED
32
+ });
33
+ }
34
+ return memo.replace(memo.slice(delimeterIndex, delimeterIndex + abbreviationAmount), '');
35
+ };
36
+ exports.makeSwapMemo = makeSwapMemo;
@@ -0,0 +1,14 @@
1
+ export declare const midgardResponse: {
2
+ asset: string;
3
+ assetDepth: string;
4
+ assetPrice: string;
5
+ assetPriceUSD: string;
6
+ liquidityUnits: string;
7
+ poolAPY: string;
8
+ runeDepth: string;
9
+ status: string;
10
+ synthSupply: string;
11
+ synthUnits: string;
12
+ units: string;
13
+ volume24h: string;
14
+ }[];
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.midgardResponse = void 0;
4
+ exports.midgardResponse = [
5
+ {
6
+ asset: 'BTC.BTC',
7
+ assetDepth: '91027798705',
8
+ assetPrice: '10280.68095465986',
9
+ assetPriceUSD: '29850.505131750208',
10
+ liquidityUnits: '536055974608843',
11
+ poolAPY: '0.09305294391574037',
12
+ runeDepth: '935827756491105',
13
+ status: 'available',
14
+ synthSupply: '3281284823',
15
+ synthUnits: '9838954536080',
16
+ units: '545894929144923',
17
+ volume24h: '15031085906495'
18
+ },
19
+ {
20
+ asset: 'ETH.ETH',
21
+ assetDepth: '915018987646',
22
+ assetPrice: '676.2118757936507',
23
+ assetPriceUSD: '1963.4172247490626',
24
+ liquidityUnits: '273709963437801',
25
+ poolAPY: '0.10532151323548256',
26
+ runeDepth: '618746706022909',
27
+ status: 'available',
28
+ synthSupply: '3572065751',
29
+ synthUnits: '535301524652',
30
+ units: '274245264962453',
31
+ volume24h: '9890096673763'
32
+ },
33
+ {
34
+ asset: 'ETH.FOX-0XC770EEFAD204B5180DF6A14EE197D99D808EE52D',
35
+ assetDepth: '166650912393467',
36
+ assetPrice: '0.05303710198887871',
37
+ assetPriceUSD: '0.15399605260336216',
38
+ liquidityUnits: '10015457121887',
39
+ poolAPY: '0.2597568967423438',
40
+ runeDepth: '8838681437152',
41
+ status: 'available',
42
+ synthSupply: '17428372569375',
43
+ synthUnits: '552604585625',
44
+ units: '10568061707512',
45
+ volume24h: '251596933033'
46
+ }
47
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shapeshiftoss/swapper",
3
- "version": "5.2.2",
3
+ "version": "5.4.0",
4
4
  "description": "TODO: description",
5
5
  "repository": "https://github.com/shapeshift/lib",
6
6
  "license": "MIT",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "peerDependencies": {
33
33
  "@shapeshiftoss/asset-service": "^4.2.4",
34
- "@shapeshiftoss/caip": "^5.0.0",
34
+ "@shapeshiftoss/caip": "^5.2.1",
35
35
  "@shapeshiftoss/chain-adapters": "^4.3.3",
36
36
  "@shapeshiftoss/hdwallet-core": "1.20.0",
37
37
  "@shapeshiftoss/types": "^4.3.1",
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "devDependencies": {
41
41
  "@shapeshiftoss/asset-service": "^4.2.4",
42
- "@shapeshiftoss/caip": "^5.0.0",
42
+ "@shapeshiftoss/caip": "^5.2.1",
43
43
  "@shapeshiftoss/chain-adapters": "^4.3.3",
44
44
  "@shapeshiftoss/hdwallet-core": "^1.20.0",
45
45
  "@shapeshiftoss/types": "^4.3.1",