@cityofzion/bs-neo3 1.2.1 → 1.3.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.
Files changed (45) hide show
  1. package/dist/BSNeo3.d.ts +3 -3
  2. package/dist/BSNeo3.js +8 -8
  3. package/dist/builder/invocation/FlamingoSwapInvocationBuilderNeo3.d.ts +7 -0
  4. package/dist/builder/invocation/FlamingoSwapInvocationBuilderNeo3.js +95 -0
  5. package/dist/builder/invocation/NeonDappKitInvocationBuilderNeo3.d.ts +34 -0
  6. package/dist/builder/invocation/NeonDappKitInvocationBuilderNeo3.js +102 -0
  7. package/dist/constants/FlamingoSwapConstants.d.ts +36 -0
  8. package/dist/constants/FlamingoSwapConstants.js +853 -0
  9. package/dist/{BSNeo3Helper.js → helpers/BSNeo3Helper.js} +2 -2
  10. package/dist/helpers/FlamingoSwapHelper.d.ts +19 -0
  11. package/dist/helpers/FlamingoSwapHelper.js +84 -0
  12. package/dist/index.d.ts +13 -11
  13. package/dist/index.js +13 -11
  14. package/dist/{DoraBDSNeo3.d.ts → services/blockchain-data/DoraBDSNeo3.d.ts} +4 -4
  15. package/dist/{DoraBDSNeo3.js → services/blockchain-data/DoraBDSNeo3.js} +3 -3
  16. package/dist/{RpcBDSNeo3.d.ts → services/blockchain-data/RpcBDSNeo3.d.ts} +2 -2
  17. package/dist/{RpcBDSNeo3.js → services/blockchain-data/RpcBDSNeo3.js} +4 -4
  18. package/dist/{FlamingoEDSNeo3.d.ts → services/exchange-data/FlamingoEDSNeo3.d.ts} +1 -1
  19. package/dist/{FlamingoEDSNeo3.js → services/exchange-data/FlamingoEDSNeo3.js} +1 -1
  20. package/dist/{DoraESNeo3.d.ts → services/explorer/DoraESNeo3.d.ts} +2 -2
  21. package/dist/{DoraESNeo3.js → services/explorer/DoraESNeo3.js} +1 -1
  22. package/dist/{GhostMarketNDSNeo3.d.ts → services/nft-data/GhostMarketNDSNeo3.d.ts} +2 -2
  23. package/dist/{RpcNDSNeo3.d.ts → services/nft-data/RpcNDSNeo3.d.ts} +1 -1
  24. package/dist/services/swap/FlamingoSwapServiceNeo3.d.ts +23 -0
  25. package/dist/services/swap/FlamingoSwapServiceNeo3.js +271 -0
  26. package/dist/services/swap/handlers/FlamingoSwapDetailsHandler.d.ts +24 -0
  27. package/dist/services/swap/handlers/FlamingoSwapDetailsHandler.js +178 -0
  28. package/dist/services/swap/handlers/FlamingoSwapRouteHandler.d.ts +13 -0
  29. package/dist/services/swap/handlers/FlamingoSwapRouteHandler.js +181 -0
  30. package/dist/services/swap/handlers/FlamingoSwapSocketHandler.d.ts +9 -0
  31. package/dist/services/swap/handlers/FlamingoSwapSocketHandler.js +57 -0
  32. package/dist/services/swap/handlers/index.d.ts +3 -0
  33. package/dist/services/swap/handlers/index.js +19 -0
  34. package/package.json +8 -6
  35. package/dist/flamingo-swap/FlamingoSwapControllerService.d.ts +0 -20
  36. package/dist/flamingo-swap/FlamingoSwapControllerService.js +0 -290
  37. package/dist/flamingo-swap/FlamingoSwapHelper.d.ts +0 -48
  38. package/dist/flamingo-swap/FlamingoSwapHelper.js +0 -171
  39. package/dist/flamingo-swap/FlamingoSwapNeonDappKitInvocationBuilder.d.ts +0 -19
  40. package/dist/flamingo-swap/FlamingoSwapNeonDappKitInvocationBuilder.js +0 -208
  41. package/dist/{BSNeo3Helper.d.ts → helpers/BSNeo3Helper.d.ts} +0 -0
  42. package/dist/{NeonDappKitLedgerServiceNeo3.d.ts → services/ledger/NeonDappKitLedgerServiceNeo3.d.ts} +1 -1
  43. package/dist/{NeonDappKitLedgerServiceNeo3.js → services/ledger/NeonDappKitLedgerServiceNeo3.js} +1 -1
  44. package/dist/{GhostMarketNDSNeo3.js → services/nft-data/GhostMarketNDSNeo3.js} +1 -1
  45. /package/dist/{RpcNDSNeo3.js → services/nft-data/RpcNDSNeo3.js} +0 -0
@@ -0,0 +1,24 @@
1
+ import { Network, SwapRoute, Token } from '@cityofzion/blockchain-service';
2
+ import { BSNeo3NetworkId } from '../../../helpers/BSNeo3Helper';
3
+ type CalculateSwapDetailsArgs = {
4
+ amountToUse: string | null;
5
+ amountToReceive: string | null;
6
+ tokenToUse: Token;
7
+ tokenToReceive: Token;
8
+ slippage: number;
9
+ network: Network<BSNeo3NetworkId>;
10
+ route: SwapRoute[];
11
+ };
12
+ export declare class FlamingoSwapDetailsHandler {
13
+ #private;
14
+ static calculateSwapDetails({ amountToReceive, amountToUse, network, route, slippage, tokenToReceive, tokenToUse, }: CalculateSwapDetailsArgs): {
15
+ amountToReceiveToDisplay: string;
16
+ amountToUseToDisplay: string;
17
+ liquidityProviderFee: string;
18
+ priceImpact: string | null;
19
+ priceInverse: string | null;
20
+ minimumReceived: string | null;
21
+ maximumSelling: string | null;
22
+ };
23
+ }
24
+ export {};
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ var _a, _FlamingoSwapDetailsHandler_calculateUsingAmountToReceive, _FlamingoSwapDetailsHandler_calculateUsingAmountToUse, _FlamingoSwapDetailsHandler_formatSwapDetails, _FlamingoSwapDetailsHandler_createTradeData, _FlamingoSwapDetailsHandler_calculateAmountToUse, _FlamingoSwapDetailsHandler_calculateAmountToReceive;
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.FlamingoSwapDetailsHandler = void 0;
13
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
14
+ const FlamingoSwapConstants_1 = require("../../../constants/FlamingoSwapConstants");
15
+ const FlamingoSwapHelper_1 = require("../../../helpers/FlamingoSwapHelper");
16
+ class FlamingoSwapDetailsHandler {
17
+ static calculateSwapDetails({ amountToReceive, amountToUse, network, route, slippage, tokenToReceive, tokenToUse, }) {
18
+ const overrodeTokenToUse = FlamingoSwapHelper_1.FlamingoSwapHelper.overrideToken(network, tokenToUse);
19
+ const overrodeTokenToReceive = FlamingoSwapHelper_1.FlamingoSwapHelper.overrideToken(network, tokenToReceive);
20
+ const overrodeRoute = FlamingoSwapHelper_1.FlamingoSwapHelper.overrideRoute(network, route);
21
+ const slippageFormatted = new bignumber_js_1.default(slippage * 10).shiftedBy(-3);
22
+ if (amountToReceive) {
23
+ return __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_calculateUsingAmountToReceive).call(this, {
24
+ network,
25
+ amountToReceive,
26
+ overrodeRoute,
27
+ overrodeTokenToUse,
28
+ overrodeTokenToReceive,
29
+ slippageFormatted,
30
+ });
31
+ }
32
+ else if (amountToUse) {
33
+ return __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_calculateUsingAmountToUse).call(this, {
34
+ network,
35
+ amountToUse,
36
+ overrodeRoute,
37
+ overrodeTokenToUse,
38
+ overrodeTokenToReceive,
39
+ slippageFormatted,
40
+ });
41
+ }
42
+ else {
43
+ throw new Error('AmountToReceive or amountToUse are required, but both aren`t provided');
44
+ }
45
+ }
46
+ }
47
+ exports.FlamingoSwapDetailsHandler = FlamingoSwapDetailsHandler;
48
+ _a = FlamingoSwapDetailsHandler, _FlamingoSwapDetailsHandler_calculateUsingAmountToReceive = function _FlamingoSwapDetailsHandler_calculateUsingAmountToReceive({ network, amountToReceive, overrodeRoute, overrodeTokenToUse, overrodeTokenToReceive, slippageFormatted, }) {
49
+ const amountToReceiveBn = FlamingoSwapHelper_1.FlamingoSwapHelper.overrideAmountInput(network, amountToReceive, overrodeTokenToReceive);
50
+ const amountToUse = __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_calculateAmountToUse).call(this, {
51
+ amountToReceive,
52
+ route: overrodeRoute,
53
+ });
54
+ const amountToUseBn = new bignumber_js_1.default(amountToUse);
55
+ const maximumSelling = amountToUseBn
56
+ .times(FlamingoSwapConstants_1.FlamingoSwapConstants.BN_1.plus(slippageFormatted))
57
+ .dp(0)
58
+ .shiftedBy(-overrodeTokenToUse.decimals)
59
+ .toFixed();
60
+ const amountToUseToDisplay = FlamingoSwapHelper_1.FlamingoSwapHelper.overrideAmountToDisplay(network, amountToUse, overrodeTokenToUse);
61
+ const { fee, price, priceImpact } = __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_createTradeData).call(this, {
62
+ amountToReceive: amountToReceiveBn,
63
+ amountToUse: amountToUseBn,
64
+ route: overrodeRoute,
65
+ });
66
+ return __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_formatSwapDetails).call(this, {
67
+ amountToReceiveToDisplay: amountToReceive,
68
+ amountToUseToDisplay,
69
+ fee,
70
+ price,
71
+ priceImpact,
72
+ overrodeTokenToUse,
73
+ overrodeTokenToReceive,
74
+ slippageFormatted,
75
+ minimumReceived: null,
76
+ maximumSelling,
77
+ });
78
+ }, _FlamingoSwapDetailsHandler_calculateUsingAmountToUse = function _FlamingoSwapDetailsHandler_calculateUsingAmountToUse({ network, amountToUse, overrodeRoute, overrodeTokenToUse, overrodeTokenToReceive, slippageFormatted, }) {
79
+ const amountToUseBn = FlamingoSwapHelper_1.FlamingoSwapHelper.overrideAmountInput(network, amountToUse, overrodeTokenToUse);
80
+ const amountToReceive = __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_calculateAmountToReceive).call(this, {
81
+ amountToUse,
82
+ route: overrodeRoute,
83
+ });
84
+ const amountToReceiveBn = new bignumber_js_1.default(amountToReceive);
85
+ const minimumReceived = amountToReceiveBn
86
+ .times(FlamingoSwapConstants_1.FlamingoSwapConstants.BN_1.minus(slippageFormatted))
87
+ .dp(0)
88
+ .shiftedBy(-overrodeTokenToReceive.decimals)
89
+ .toFixed();
90
+ const amountToReceiveToDisplay = FlamingoSwapHelper_1.FlamingoSwapHelper.overrideAmountToDisplay(network, amountToReceiveBn.toString(), overrodeTokenToReceive);
91
+ const { fee, price, priceImpact } = __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_createTradeData).call(this, {
92
+ amountToReceive: amountToReceiveBn,
93
+ amountToUse: amountToUseBn,
94
+ route: overrodeRoute,
95
+ });
96
+ return __classPrivateFieldGet(this, _a, "m", _FlamingoSwapDetailsHandler_formatSwapDetails).call(this, {
97
+ amountToReceiveToDisplay,
98
+ amountToUseToDisplay: amountToUse,
99
+ fee,
100
+ price,
101
+ priceImpact,
102
+ overrodeTokenToUse,
103
+ overrodeTokenToReceive,
104
+ slippageFormatted,
105
+ minimumReceived,
106
+ maximumSelling: null,
107
+ });
108
+ }, _FlamingoSwapDetailsHandler_formatSwapDetails = function _FlamingoSwapDetailsHandler_formatSwapDetails({ amountToReceiveToDisplay, amountToUseToDisplay, fee, price, priceImpact, overrodeTokenToUse, overrodeTokenToReceive, minimumReceived, maximumSelling, }) {
109
+ const priceInverse = FlamingoSwapConstants_1.FlamingoSwapConstants.BN_1.div(price);
110
+ const diffDecimals = overrodeTokenToUse.decimals - overrodeTokenToReceive.decimals;
111
+ return {
112
+ amountToReceiveToDisplay,
113
+ amountToUseToDisplay,
114
+ liquidityProviderFee: fee.shiftedBy(-8).plus(FlamingoSwapConstants_1.FlamingoSwapConstants.BN_0).toFixed(4),
115
+ priceImpact: isFinite(Number(priceImpact)) ? priceImpact.shiftedBy(2).toFixed(4) : null,
116
+ priceInverse: isFinite(Number(priceInverse)) ? priceInverse.multipliedBy(Math.pow(10, diffDecimals)).toFixed() : null,
117
+ minimumReceived,
118
+ maximumSelling,
119
+ };
120
+ }, _FlamingoSwapDetailsHandler_createTradeData = function _FlamingoSwapDetailsHandler_createTradeData({ amountToReceive, amountToUse, route }) {
121
+ const fee = amountToUse.minus(route.reduce(acc => acc.times(FlamingoSwapConstants_1.FlamingoSwapConstants.BN_1.minus(FlamingoSwapConstants_1.FlamingoSwapConstants.FEE_RATE)), amountToUse));
122
+ const price = amountToUse.div(amountToReceive);
123
+ const midPrice = route.reduce((acc, item) => acc.times(item.reserveTokenToUse).div(item.reserveTokenToReceive), FlamingoSwapConstants_1.FlamingoSwapConstants.BN_1);
124
+ const priceImpact = price.minus(midPrice).div(price).minus(fee.div(amountToUse));
125
+ return {
126
+ fee,
127
+ price,
128
+ priceImpact,
129
+ midPrice,
130
+ };
131
+ }, _FlamingoSwapDetailsHandler_calculateAmountToUse = function _FlamingoSwapDetailsHandler_calculateAmountToUse({ amountToReceive, route }) {
132
+ let amountToUse = '';
133
+ let tempAmountToReceive = amountToReceive;
134
+ route
135
+ .reverse()
136
+ .map(({ tokenToUse: tradeTokenToUse, tokenToReceive: tradeTokenToReceive, reserveTokenToUse, reserveTokenToReceive, }, index) => {
137
+ if (amountToUse) {
138
+ tempAmountToReceive = amountToUse;
139
+ }
140
+ const reserveTokenToUseBn = new bignumber_js_1.default(reserveTokenToUse);
141
+ const reserveTokenToReceiveBn = new bignumber_js_1.default(reserveTokenToReceive);
142
+ const tempAmountToReceiveBn = new bignumber_js_1.default(tempAmountToReceive).shiftedBy(tradeTokenToReceive.decimals);
143
+ amountToUse = reserveTokenToUseBn
144
+ .times(tempAmountToReceiveBn)
145
+ .times(1000)
146
+ .idiv(reserveTokenToReceiveBn.minus(tempAmountToReceiveBn).times(997))
147
+ .plus(1)
148
+ .toFixed();
149
+ if (route.length > 1) {
150
+ amountToUse = new bignumber_js_1.default(amountToUse).shiftedBy(-tradeTokenToUse.decimals).toFixed();
151
+ if (index === route.length - 1) {
152
+ amountToUse = new bignumber_js_1.default(amountToUse).shiftedBy(tradeTokenToUse.decimals).toFixed();
153
+ }
154
+ }
155
+ });
156
+ return amountToUse;
157
+ }, _FlamingoSwapDetailsHandler_calculateAmountToReceive = function _FlamingoSwapDetailsHandler_calculateAmountToReceive({ amountToUse, route }) {
158
+ let amountToReceive = '';
159
+ let tempAmountToUse = amountToUse;
160
+ route.map(({ tokenToUse: tradeTokenToUse, tokenToReceive: tradeTokenToReceive, reserveTokenToUse, reserveTokenToReceive }, index) => {
161
+ if (amountToReceive) {
162
+ tempAmountToUse = amountToReceive;
163
+ }
164
+ const reserveTokenToUseBn = new bignumber_js_1.default(reserveTokenToUse);
165
+ const tempAmountToUseWithFee = new bignumber_js_1.default(tempAmountToUse).times(997).shiftedBy(tradeTokenToUse.decimals);
166
+ amountToReceive = tempAmountToUseWithFee
167
+ .times(reserveTokenToReceive)
168
+ .idiv(reserveTokenToUseBn.times(1000).plus(tempAmountToUseWithFee))
169
+ .toFixed();
170
+ if (route.length > 1) {
171
+ amountToReceive = new bignumber_js_1.default(amountToReceive).shiftedBy(-tradeTokenToReceive.decimals).toFixed();
172
+ if (index === route.length - 1) {
173
+ amountToReceive = new bignumber_js_1.default(amountToReceive).shiftedBy(tradeTokenToReceive.decimals).toFixed();
174
+ }
175
+ }
176
+ });
177
+ return amountToReceive;
178
+ };
@@ -0,0 +1,13 @@
1
+ import { Network, PoolGraph, SwapRoute, Token } from '@cityofzion/blockchain-service';
2
+ import { BSNeo3NetworkId } from '../../../helpers/BSNeo3Helper';
3
+ type CalculateBestRouteForSwapArgs = {
4
+ tokenToUse: Token;
5
+ tokenToReceive: Token;
6
+ network: Network<BSNeo3NetworkId>;
7
+ };
8
+ export declare class FlamingoSwapRouteHandler {
9
+ #private;
10
+ static calculateBestRouteForSwap({ tokenToUse, tokenToReceive, network, }: CalculateBestRouteForSwapArgs): Promise<SwapRoute[]>;
11
+ static createPoolGraph(network: Network<BSNeo3NetworkId>): PoolGraph;
12
+ }
13
+ export {};
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var _a, _FlamingoSwapRouteHandler_invokeReserves, _FlamingoSwapRouteHandler_createSwapRoute, _FlamingoSwapRouteHandler_getShortestRoutePath;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.FlamingoSwapRouteHandler = void 0;
19
+ const neon_dappkit_1 = require("@cityofzion/neon-dappkit");
20
+ const neon_dappkit_types_1 = require("@cityofzion/neon-dappkit-types");
21
+ const NeonDappKitInvocationBuilderNeo3_1 = require("../../../builder/invocation/NeonDappKitInvocationBuilderNeo3");
22
+ const FlamingoSwapHelper_1 = require("../../../helpers/FlamingoSwapHelper");
23
+ class FlamingoSwapRouteHandler {
24
+ static calculateBestRouteForSwap({ tokenToUse, tokenToReceive, network, }) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const routePath = __classPrivateFieldGet(this, _a, "m", _FlamingoSwapRouteHandler_getShortestRoutePath).call(this, {
27
+ network,
28
+ startToken: tokenToUse,
29
+ targetToken: tokenToReceive,
30
+ });
31
+ if (routePath.length === 0)
32
+ return [];
33
+ const { stack: reservesStack } = yield __classPrivateFieldGet(this, _a, "m", _FlamingoSwapRouteHandler_invokeReserves).call(this, { network, routePath });
34
+ return __classPrivateFieldGet(this, _a, "m", _FlamingoSwapRouteHandler_createSwapRoute).call(this, { network, routePath, reservesStack });
35
+ });
36
+ }
37
+ static createPoolGraph(network) {
38
+ const pools = FlamingoSwapHelper_1.FlamingoSwapHelper.getFlamingoSwapPools(network);
39
+ const tokens = FlamingoSwapHelper_1.FlamingoSwapHelper.getFlamingoSwapTokens(network);
40
+ const { NEO, bNEO } = tokens;
41
+ const poolGraph = {};
42
+ // Initialize poolGraph with empty arrays
43
+ Object.values(tokens).forEach(token => {
44
+ poolGraph[token.symbol] = [];
45
+ });
46
+ // Add edges to poolGraph
47
+ Object.values(pools).forEach(pool => {
48
+ const tokenA = pool.tokens[0].symbol;
49
+ const tokenB = pool.tokens[1].symbol;
50
+ poolGraph[tokenA].push(tokenB);
51
+ poolGraph[tokenB].push(tokenA);
52
+ });
53
+ // Remove duplicates from poolGraph
54
+ Object.keys(poolGraph).forEach(tokenSymbol => {
55
+ poolGraph[tokenSymbol] = [...new Set(poolGraph[tokenSymbol])];
56
+ });
57
+ // Include NEO to the poolGraph
58
+ poolGraph[NEO.symbol] = Object.keys(tokens).filter(tokenSymbol => tokenSymbol === bNEO.symbol);
59
+ // Include relationship between NEO and bNEO
60
+ poolGraph[bNEO.symbol].push(NEO.symbol);
61
+ return poolGraph;
62
+ }
63
+ }
64
+ exports.FlamingoSwapRouteHandler = FlamingoSwapRouteHandler;
65
+ _a = FlamingoSwapRouteHandler, _FlamingoSwapRouteHandler_invokeReserves = function _FlamingoSwapRouteHandler_invokeReserves({ network, routePath }) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const invoker = yield neon_dappkit_1.NeonInvoker.init({
68
+ rpcAddress: network.url,
69
+ });
70
+ const scriptHashes = FlamingoSwapHelper_1.FlamingoSwapHelper.getFlamingoSwapScriptHashes(network);
71
+ const routerScriptHash = scriptHashes.flamingoSwapRouter;
72
+ // Remove NEO token from the routePath because it's not supported by the router
73
+ const routePathWithoutNeo = routePath.filter(route => !FlamingoSwapHelper_1.FlamingoSwapHelper.isNeoToken(network, route.tokenToUse) &&
74
+ !FlamingoSwapHelper_1.FlamingoSwapHelper.isNeoToken(network, route.tokenToReceive));
75
+ const getReservesContractInvocations = routePathWithoutNeo.map(route => NeonDappKitInvocationBuilderNeo3_1.NeonDappKitInvocationBuilderNeo3.getReservesContractInvocation({
76
+ routerScriptHash,
77
+ tokenToUseHash: route.tokenToUse.hash,
78
+ tokenToReceiveHash: route.tokenToReceive.hash,
79
+ }));
80
+ const getReservesContractInvocationMulti = {
81
+ invocations: [...getReservesContractInvocations],
82
+ };
83
+ return yield invoker.testInvoke(getReservesContractInvocationMulti);
84
+ });
85
+ }, _FlamingoSwapRouteHandler_createSwapRoute = function _FlamingoSwapRouteHandler_createSwapRoute({ network, routePath, reservesStack }) {
86
+ const isNeoTokenToUse = FlamingoSwapHelper_1.FlamingoSwapHelper.isNeoToken(network, routePath[0].tokenToUse);
87
+ const isNeoTokenToReceive = FlamingoSwapHelper_1.FlamingoSwapHelper.isNeoToken(network, routePath[routePath.length - 1].tokenToReceive);
88
+ const swapRoute = [];
89
+ for (let index = 0; index < reservesStack.length; index++) {
90
+ const item = reservesStack[index];
91
+ if (!neon_dappkit_types_1.TypeChecker.isStackTypeArray(item) ||
92
+ !neon_dappkit_types_1.TypeChecker.isStackTypeInteger(item.value[0]) ||
93
+ !neon_dappkit_types_1.TypeChecker.isStackTypeInteger(item.value[1])) {
94
+ throw new Error('Invalid reserves response');
95
+ }
96
+ // Include NEO token in the swapRoute with 0 reserves because it wasn't supported by the router during the reserves invocation
97
+ if (isNeoTokenToUse && index === 0) {
98
+ swapRoute.push({
99
+ tokenToUse: routePath[index].tokenToUse,
100
+ reserveTokenToUse: '0',
101
+ tokenToReceive: routePath[index].tokenToReceive,
102
+ reserveTokenToReceive: '0',
103
+ });
104
+ index++;
105
+ }
106
+ swapRoute.push({
107
+ tokenToUse: routePath[index].tokenToUse,
108
+ reserveTokenToUse: item.value[1].value,
109
+ tokenToReceive: routePath[index].tokenToReceive,
110
+ reserveTokenToReceive: item.value[0].value,
111
+ });
112
+ }
113
+ // Include NEO token in the swapRoute with 0 reserves because it wasn't supported by the router during the reserves invocation
114
+ if (isNeoTokenToReceive) {
115
+ swapRoute.push({
116
+ tokenToUse: routePath[routePath.length - 1].tokenToUse,
117
+ reserveTokenToUse: '0',
118
+ tokenToReceive: routePath[routePath.length - 1].tokenToReceive,
119
+ reserveTokenToReceive: '0',
120
+ });
121
+ }
122
+ return swapRoute;
123
+ }, _FlamingoSwapRouteHandler_getShortestRoutePath = function _FlamingoSwapRouteHandler_getShortestRoutePath({ network, startToken, targetToken }) {
124
+ // Initialize an empty object to track predecessors of each token
125
+ const predecessor = {};
126
+ // Create a graph representation of the token network
127
+ const poolGraph = this.createPoolGraph(network);
128
+ // Initialize the queue with the start token's symbol
129
+ const queue = [startToken.symbol];
130
+ // Track visited tokens, starting with the start token marked as visited
131
+ const tokensVisited = {
132
+ [startToken.symbol]: true,
133
+ };
134
+ // Initialize an empty array to store the path of tokens
135
+ let path = [];
136
+ while (queue.length) {
137
+ // Remove and get the first token symbol from the queue
138
+ const currentTokenSymbol = queue.shift();
139
+ if (!currentTokenSymbol)
140
+ break;
141
+ const currentToken = FlamingoSwapHelper_1.FlamingoSwapHelper.getFlamingoSwapToken(network, currentTokenSymbol);
142
+ if (!currentToken)
143
+ continue;
144
+ // Get the neighbors of the current token from the graph
145
+ const neighbours = poolGraph[currentToken.symbol];
146
+ for (const neighbourSymbol of neighbours || []) {
147
+ if (tokensVisited[neighbourSymbol])
148
+ continue; // Skip if the neighbor has already been visited
149
+ // Mark the neighbor token as visited
150
+ tokensVisited[neighbourSymbol] = true;
151
+ // Record the current token as the predecessor of the neighbor token
152
+ predecessor[neighbourSymbol] = currentToken;
153
+ // Add the neighbor token symbol to the queue
154
+ queue.push(neighbourSymbol);
155
+ if (neighbourSymbol === targetToken.symbol) {
156
+ // Initialize the path with the target token
157
+ path = [targetToken];
158
+ // Start reconstructing the path from the target token back to the start token
159
+ let prevToken = currentToken;
160
+ while (prevToken && prevToken.symbol !== startToken.symbol) {
161
+ path.push(prevToken); // Add the predecessor token to the path
162
+ prevToken = predecessor[prevToken.symbol]; // Move to the predecessor token
163
+ }
164
+ // If the start token is reached, add it to the path and reverse the path to start-to-end order
165
+ if (prevToken) {
166
+ path.push(prevToken);
167
+ path.reverse();
168
+ }
169
+ break;
170
+ }
171
+ }
172
+ if (path.length)
173
+ break;
174
+ }
175
+ const routePath = [];
176
+ // Convert the token path into route paths
177
+ for (let i = 0; i < path.length - 1; i++) {
178
+ routePath.push({ tokenToUse: path[i], tokenToReceive: path[i + 1] });
179
+ }
180
+ return routePath;
181
+ };
@@ -0,0 +1,9 @@
1
+ type ListenBlockAddedParams = {
2
+ callback: () => Promise<void> | void;
3
+ };
4
+ export declare class FlamingoSwapSocketService {
5
+ #private;
6
+ onBlockAdded({ callback }: ListenBlockAddedParams): void;
7
+ closeConnection(): void;
8
+ }
9
+ export {};
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
12
+ if (kind === "m") throw new TypeError("Private method is not writable");
13
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
14
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
15
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
16
+ };
17
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
18
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
19
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
+ };
22
+ var __importDefault = (this && this.__importDefault) || function (mod) {
23
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
+ };
25
+ var _FlamingoSwapSocketService_ws;
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.FlamingoSwapSocketService = void 0;
28
+ const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
29
+ const FlamingoSwapConstants_1 = require("../../../constants/FlamingoSwapConstants");
30
+ class FlamingoSwapSocketService {
31
+ constructor() {
32
+ _FlamingoSwapSocketService_ws.set(this, void 0);
33
+ }
34
+ onBlockAdded({ callback }) {
35
+ __classPrivateFieldSet(this, _FlamingoSwapSocketService_ws, new isomorphic_ws_1.default(FlamingoSwapConstants_1.BLOCKCHAIN_WSS_URL), "f");
36
+ __classPrivateFieldGet(this, _FlamingoSwapSocketService_ws, "f").onopen = () => {
37
+ const block_added = {
38
+ jsonrpc: '2.0',
39
+ method: 'subscribe',
40
+ params: ['block_added'],
41
+ id: 1,
42
+ };
43
+ __classPrivateFieldGet(this, _FlamingoSwapSocketService_ws, "f").send(JSON.stringify(block_added));
44
+ };
45
+ __classPrivateFieldGet(this, _FlamingoSwapSocketService_ws, "f").onmessage = () => __awaiter(this, void 0, void 0, function* () {
46
+ yield callback();
47
+ });
48
+ }
49
+ closeConnection() {
50
+ if (!__classPrivateFieldGet(this, _FlamingoSwapSocketService_ws, "f"))
51
+ return;
52
+ __classPrivateFieldGet(this, _FlamingoSwapSocketService_ws, "f").close();
53
+ __classPrivateFieldSet(this, _FlamingoSwapSocketService_ws, null, "f");
54
+ }
55
+ }
56
+ exports.FlamingoSwapSocketService = FlamingoSwapSocketService;
57
+ _FlamingoSwapSocketService_ws = new WeakMap();
@@ -0,0 +1,3 @@
1
+ export * from './FlamingoSwapDetailsHandler';
2
+ export * from './FlamingoSwapRouteHandler';
3
+ export * from './FlamingoSwapSocketHandler';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./FlamingoSwapDetailsHandler"), exports);
18
+ __exportStar(require("./FlamingoSwapRouteHandler"), exports);
19
+ __exportStar(require("./FlamingoSwapSocketHandler"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityofzion/bs-neo3",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": "https://github.com/CityOfZion/blockchain-services",
@@ -17,14 +17,16 @@
17
17
  "query-string": "7.1.3",
18
18
  "@ledgerhq/hw-transport": "~6.30.5",
19
19
  "@cityofzion/neon-dappkit": "0.4.1",
20
- "bignumber.js": "~9.1.2",
21
- "isomorphic-ws": "~5.0.0",
22
- "@cityofzion/bs-asteroid-sdk": "0.9.0",
23
- "@cityofzion/blockchain-service": "1.2.0"
20
+ "bignumber.js": "^9.1.2",
21
+ "isomorphic-ws": "^5.0.0",
22
+ "lodash.clonedeep": "^4.5.0",
23
+ "@cityofzion/blockchain-service": "1.3.0",
24
+ "@cityofzion/bs-asteroid-sdk": "0.9.0"
24
25
  },
25
26
  "devDependencies": {
26
27
  "@cityofzion/neon-dappkit-types": "~0.3.1",
27
28
  "@ledgerhq/hw-transport-node-hid": "~6.28.5",
29
+ "@types/lodash.clonedeep": "^4.5.9",
28
30
  "@types/jest": "29.5.3",
29
31
  "@typescript-eslint/eslint-plugin": "^6.5.0",
30
32
  "@typescript-eslint/parser": "^6.5.0",
@@ -34,7 +36,7 @@
34
36
  "ts-jest": "29.1.1",
35
37
  "ts-node": "10.9.1",
36
38
  "typescript": "4.9.5",
37
- "typed-emitter": "~2.1.0"
39
+ "typed-emitter": "^2.1.0"
38
40
  },
39
41
  "scripts": {
40
42
  "build": "tsc --project tsconfig.build.json",
@@ -1,20 +0,0 @@
1
- import { Account, Network, SwapControllerService, SwapControllerServiceEvents, SwapControllerServiceSwapToReceiveArgs, SwapControllerServiceSwapToUseArgs, Token } from '@cityofzion/blockchain-service';
2
- import TypedEmitter from 'typed-emitter';
3
- import { BSNeo3NetworkId } from '../BSNeo3Helper';
4
- export declare class FlamingoSwapControllerService implements SwapControllerService<BSNeo3NetworkId> {
5
- #private;
6
- eventEmitter: TypedEmitter<SwapControllerServiceEvents>;
7
- constructor(network: Network<BSNeo3NetworkId>);
8
- buildSwapArgs(): SwapControllerServiceSwapToReceiveArgs<BSNeo3NetworkId> | SwapControllerServiceSwapToUseArgs<BSNeo3NetworkId>;
9
- setAccountToUse(account: Account | null): void;
10
- setAmountToUse(val: string | null): void;
11
- setAmountToReceive(val: string | null): void;
12
- setDeadline(deadline: string): void;
13
- setSlippage(slippage: number): void;
14
- setTokenToUse(val: Token | null): Promise<void>;
15
- setTokenToReceive(val: Token | null): Promise<void>;
16
- swap(isLedger?: boolean): Promise<void>;
17
- setReserves(): Promise<void>;
18
- startListeningBlockGeneration(): void;
19
- stopListeningBlockGeneration(): void;
20
- }