@shapeshiftoss/swapper 9.17.0 → 11.0.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/swappers/osmosis/OsmosisSwapper.d.ts +4 -4
- package/dist/swappers/osmosis/OsmosisSwapper.js +39 -10
- package/dist/swappers/osmosis/utils/helpers.d.ts +1 -1
- package/dist/swappers/osmosis/utils/helpers.js +2 -2
- package/dist/swappers/osmosis/utils/types.d.ts +5 -0
- package/dist/swappers/thorchain/ThorchainSwapper.js +3 -3
- package/dist/swappers/thorchain/buildThorTrade/buildThorTrade.js +3 -3
- package/dist/swappers/thorchain/getThorTradeQuote/getTradeQuote.js +3 -3
- package/dist/swappers/thorchain/thorTradeApprovalNeeded/thorTradeApprovalNeeded.js +1 -1
- package/package.json +3 -3
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { Asset } from '@shapeshiftoss/asset-service';
|
|
2
2
|
import { AssetId, ChainId } from '@shapeshiftoss/caip';
|
|
3
|
-
import { ApprovalNeededOutput, BuildTradeInput, BuyAssetBySellIdInput, ExecuteTradeInput, GetTradeQuoteInput, MinMaxOutput, Swapper, SwapperType, Trade, TradeQuote,
|
|
4
|
-
import { OsmoSwapperDeps } from './utils/types';
|
|
3
|
+
import { ApprovalNeededOutput, BuildTradeInput, BuyAssetBySellIdInput, ExecuteTradeInput, GetTradeQuoteInput, MinMaxOutput, Swapper, SwapperType, Trade, TradeQuote, TradeTxs } from '../../api';
|
|
4
|
+
import { OsmosisTradeResult, OsmoSwapperDeps } from './utils/types';
|
|
5
5
|
export declare class OsmosisSwapper implements Swapper<ChainId> {
|
|
6
6
|
readonly name = "Osmosis";
|
|
7
7
|
supportedAssetIds: string[];
|
|
8
8
|
deps: OsmoSwapperDeps;
|
|
9
9
|
getType(): SwapperType;
|
|
10
10
|
constructor(deps: OsmoSwapperDeps);
|
|
11
|
-
getTradeTxs(tradeResult:
|
|
11
|
+
getTradeTxs(tradeResult: OsmosisTradeResult): Promise<TradeTxs>;
|
|
12
12
|
getUsdRate(input: Pick<Asset, 'symbol' | 'assetId'>): Promise<string>;
|
|
13
13
|
getMinMax(input: {
|
|
14
14
|
sellAsset: Asset;
|
|
@@ -20,5 +20,5 @@ export declare class OsmosisSwapper implements Swapper<ChainId> {
|
|
|
20
20
|
filterAssetIdsBySellable(): AssetId[];
|
|
21
21
|
buildTrade(args: BuildTradeInput): Promise<Trade<ChainId>>;
|
|
22
22
|
getTradeQuote(input: GetTradeQuoteInput): Promise<TradeQuote<ChainId>>;
|
|
23
|
-
executeTrade({ trade, wallet }: ExecuteTradeInput<ChainId>): Promise<
|
|
23
|
+
executeTrade({ trade, wallet }: ExecuteTradeInput<ChainId>): Promise<OsmosisTradeResult>;
|
|
24
24
|
}
|
|
@@ -16,10 +16,31 @@ class OsmosisSwapper {
|
|
|
16
16
|
return api_1.SwapperType.Osmosis;
|
|
17
17
|
}
|
|
18
18
|
async getTradeTxs(tradeResult) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
if (tradeResult.cosmosAddress) {
|
|
20
|
+
const cosmosAdapter = this.deps.adapterManager.get(caip_1.cosmosChainId);
|
|
21
|
+
if (!cosmosAdapter)
|
|
22
|
+
throw new api_1.SwapError('OsmosisSwapper: couldnt get cosmos adapter', {
|
|
23
|
+
code: api_1.SwapErrorTypes.GET_TRADE_TXS_FAILED,
|
|
24
|
+
});
|
|
25
|
+
const cosmosTxHistory = await cosmosAdapter.getTxHistory({
|
|
26
|
+
pubkey: tradeResult.cosmosAddress,
|
|
27
|
+
pageSize: 1,
|
|
28
|
+
});
|
|
29
|
+
const currentCosmosTxid = cosmosTxHistory === null || cosmosTxHistory === void 0 ? void 0 : cosmosTxHistory.transactions[0].txid;
|
|
30
|
+
return {
|
|
31
|
+
sellTxid: tradeResult.tradeId,
|
|
32
|
+
// This logic assumes there are the next cosmos tx will be the correct ibc transfer
|
|
33
|
+
// a random incoming tx COULD cause this logic to fail but its unlikely
|
|
34
|
+
// TODO find a better solution (may require unchained and parser additions)
|
|
35
|
+
buyTxid: currentCosmosTxid !== tradeResult.previousCosmosTxid ? currentCosmosTxid : '',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return {
|
|
40
|
+
sellTxid: tradeResult.previousCosmosTxid,
|
|
41
|
+
buyTxid: tradeResult.tradeId,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
23
44
|
}
|
|
24
45
|
async getUsdRate(input) {
|
|
25
46
|
const { symbol } = input;
|
|
@@ -137,9 +158,10 @@ class OsmosisSwapper {
|
|
|
137
158
|
code: api_1.SwapErrorTypes.EXECUTE_TRADE_FAILED,
|
|
138
159
|
});
|
|
139
160
|
}
|
|
140
|
-
let sellAddress;
|
|
141
161
|
const feeData = await osmosisAdapter.getFeeData({});
|
|
142
162
|
const gas = feeData.fast.chainSpecific.gasLimit;
|
|
163
|
+
let sellAddress;
|
|
164
|
+
let cosmosIbcTradeId = '';
|
|
143
165
|
if (!isFromOsmo) {
|
|
144
166
|
const sellBip44Params = cosmosAdapter.buildBIP44Params({
|
|
145
167
|
accountNumber: Number(sellAssetAccountNumber),
|
|
@@ -157,7 +179,8 @@ class OsmosisSwapper {
|
|
|
157
179
|
const responseAccount = await cosmosAdapter.getAccount(sellAddress);
|
|
158
180
|
const accountNumber = responseAccount.chainSpecific.accountNumber || '0';
|
|
159
181
|
const sequence = responseAccount.chainSpecific.sequence || '0';
|
|
160
|
-
const { tradeId } = await (0, helpers_1.performIbcTransfer)(transfer, cosmosAdapter, wallet, this.deps.osmoUrl, 'uatom', constants_1.COSMO_OSMO_CHANNEL,
|
|
182
|
+
const { tradeId } = await (0, helpers_1.performIbcTransfer)(transfer, cosmosAdapter, wallet, this.deps.osmoUrl, 'uatom', constants_1.COSMO_OSMO_CHANNEL, feeData.fast.txFee, accountNumber, sequence, gas, 'uatom');
|
|
183
|
+
cosmosIbcTradeId = tradeId;
|
|
161
184
|
// wait till confirmed
|
|
162
185
|
const pollResult = await (0, helpers_1.pollForComplete)(tradeId, this.deps.cosmosUrl);
|
|
163
186
|
if (pollResult !== 'success')
|
|
@@ -167,7 +190,7 @@ class OsmosisSwapper {
|
|
|
167
190
|
ibcSellAmount = await (0, helpers_1.pollForAtomChannelBalance)(receiveAddress, this.deps.osmoUrl);
|
|
168
191
|
// delay to ensure all nodes we interact with are up to date at this point
|
|
169
192
|
// seeing intermittent bugs that suggest the balances and sequence numbers were sometimes off
|
|
170
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
193
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
171
194
|
}
|
|
172
195
|
else {
|
|
173
196
|
const sellBip44Params = osmosisAdapter.buildBIP44Params({
|
|
@@ -180,6 +203,7 @@ class OsmosisSwapper {
|
|
|
180
203
|
});
|
|
181
204
|
}
|
|
182
205
|
const osmoAddress = isFromOsmo ? sellAddress : receiveAddress;
|
|
206
|
+
const cosmosAddress = isFromOsmo ? receiveAddress : sellAddress;
|
|
183
207
|
const signTxInput = await (0, helpers_1.buildTradeTx)({
|
|
184
208
|
osmoAddress,
|
|
185
209
|
adapter: osmosisAdapter,
|
|
@@ -208,10 +232,15 @@ class OsmosisSwapper {
|
|
|
208
232
|
const ibcSequence = ibcResponseAccount.chainSpecific.sequence || '0';
|
|
209
233
|
// delay to ensure all nodes we interact with are up to date at this point
|
|
210
234
|
// seeing intermittent bugs that suggest the balances and sequence numbers were sometimes off
|
|
211
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
212
|
-
|
|
235
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
236
|
+
const cosmosTxHistory = await cosmosAdapter.getTxHistory({
|
|
237
|
+
pubkey: cosmosAddress,
|
|
238
|
+
pageSize: 1,
|
|
239
|
+
});
|
|
240
|
+
await (0, helpers_1.performIbcTransfer)(transfer, osmosisAdapter, wallet, this.deps.cosmosUrl, buyAssetDenom, constants_1.OSMO_COSMO_CHANNEL, '0', ibcAccountNumber, ibcSequence, gas, 'uosmo');
|
|
241
|
+
return { tradeId, previousCosmosTxid: cosmosTxHistory.transactions[0].txid, cosmosAddress };
|
|
213
242
|
}
|
|
214
|
-
return { tradeId:
|
|
243
|
+
return { tradeId, previousCosmosTxid: cosmosIbcTradeId };
|
|
215
244
|
}
|
|
216
245
|
}
|
|
217
246
|
exports.OsmosisSwapper = OsmosisSwapper;
|
|
@@ -21,7 +21,7 @@ export declare const getRateInfo: (sellAsset: string, buyAsset: string, sellAmou
|
|
|
21
21
|
tradeFee: string;
|
|
22
22
|
buyAmount: string;
|
|
23
23
|
}>;
|
|
24
|
-
export declare const performIbcTransfer: (input: IbcTransferInput, adapter: CosmosSdkSupportedChainAdapters, wallet: HDWallet, blockBaseUrl: string, denom: string, sourceChannel: string, feeAmount: string, accountNumber: string, sequence: string, gas: string) => Promise<TradeResult>;
|
|
24
|
+
export declare const performIbcTransfer: (input: IbcTransferInput, adapter: CosmosSdkSupportedChainAdapters, wallet: HDWallet, blockBaseUrl: string, denom: string, sourceChannel: string, feeAmount: string, accountNumber: string, sequence: string, gas: string, feeDenom: string) => Promise<TradeResult>;
|
|
25
25
|
export declare const buildTradeTx: ({ osmoAddress, adapter, buyAssetDenom, sellAssetDenom, sellAmount, gas, wallet, }: {
|
|
26
26
|
osmoAddress: string;
|
|
27
27
|
adapter: osmosis.ChainAdapter;
|
|
@@ -160,7 +160,7 @@ const getRateInfo = async (sellAsset, buyAsset, sellAmount, osmoUrl) => {
|
|
|
160
160
|
};
|
|
161
161
|
exports.getRateInfo = getRateInfo;
|
|
162
162
|
// TODO: move to chain adapters
|
|
163
|
-
const performIbcTransfer = async (input, adapter, wallet, blockBaseUrl, denom, sourceChannel, feeAmount, accountNumber, sequence, gas) => {
|
|
163
|
+
const performIbcTransfer = async (input, adapter, wallet, blockBaseUrl, denom, sourceChannel, feeAmount, accountNumber, sequence, gas, feeDenom) => {
|
|
164
164
|
const { sender, receiver, amount } = input;
|
|
165
165
|
const responseLatestBlock = await (async () => {
|
|
166
166
|
try {
|
|
@@ -184,7 +184,7 @@ const performIbcTransfer = async (input, adapter, wallet, blockBaseUrl, denom, s
|
|
|
184
184
|
amount: [
|
|
185
185
|
{
|
|
186
186
|
amount: feeAmount.toString(),
|
|
187
|
-
denom:
|
|
187
|
+
denom: feeDenom,
|
|
188
188
|
},
|
|
189
189
|
],
|
|
190
190
|
gas,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ChainAdapterManager } from '@shapeshiftoss/chain-adapters';
|
|
2
|
+
import { TradeResult } from '../../../api';
|
|
2
3
|
export declare type OsmoSwapperDeps = {
|
|
3
4
|
adapterManager: ChainAdapterManager;
|
|
4
5
|
osmoUrl: string;
|
|
@@ -20,3 +21,7 @@ export declare type PoolAssetInfo = {
|
|
|
20
21
|
amount: string;
|
|
21
22
|
};
|
|
22
23
|
};
|
|
24
|
+
export interface OsmosisTradeResult extends TradeResult {
|
|
25
|
+
previousCosmosTxid: string;
|
|
26
|
+
cosmosAddress?: string;
|
|
27
|
+
}
|
|
@@ -116,7 +116,7 @@ class ThorchainSwapper {
|
|
|
116
116
|
fn: 'executeTrade',
|
|
117
117
|
});
|
|
118
118
|
const { chainNamespace } = (0, caip_1.fromAssetId)(trade.sellAsset.assetId);
|
|
119
|
-
if (chainNamespace === caip_1.CHAIN_NAMESPACE.
|
|
119
|
+
if (chainNamespace === caip_1.CHAIN_NAMESPACE.Evm) {
|
|
120
120
|
const signedTx = await adapter.signTransaction({
|
|
121
121
|
txToSign: trade.txData,
|
|
122
122
|
wallet,
|
|
@@ -124,7 +124,7 @@ class ThorchainSwapper {
|
|
|
124
124
|
const txid = await adapter.broadcastTransaction(signedTx);
|
|
125
125
|
return { tradeId: txid };
|
|
126
126
|
}
|
|
127
|
-
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.
|
|
127
|
+
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.Utxo) {
|
|
128
128
|
const signedTx = await adapter.signTransaction({
|
|
129
129
|
txToSign: trade.txData,
|
|
130
130
|
wallet,
|
|
@@ -132,7 +132,7 @@ class ThorchainSwapper {
|
|
|
132
132
|
const txid = await adapter.broadcastTransaction(signedTx);
|
|
133
133
|
return { tradeId: txid };
|
|
134
134
|
}
|
|
135
|
-
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.
|
|
135
|
+
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.CosmosSdk) {
|
|
136
136
|
const signedTx = await adapter.signTransaction({
|
|
137
137
|
txToSign: trade.txData,
|
|
138
138
|
wallet,
|
|
@@ -22,7 +22,7 @@ const buildTrade = async ({ deps, input, }) => {
|
|
|
22
22
|
details: { sellAsset },
|
|
23
23
|
});
|
|
24
24
|
const { chainNamespace } = (0, caip_1.fromAssetId)(sellAsset.assetId);
|
|
25
|
-
if (chainNamespace === caip_1.CHAIN_NAMESPACE.
|
|
25
|
+
if (chainNamespace === caip_1.CHAIN_NAMESPACE.Evm) {
|
|
26
26
|
const sellAssetBip44Params = sellAdapter.buildBIP44Params({
|
|
27
27
|
accountNumber: sellAssetAccountNumber,
|
|
28
28
|
});
|
|
@@ -47,7 +47,7 @@ const buildTrade = async ({ deps, input, }) => {
|
|
|
47
47
|
txData: ethTradeTx.txToSign,
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
-
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.
|
|
50
|
+
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.Utxo) {
|
|
51
51
|
const { vault, opReturnData } = await (0, getThorTxData_1.getThorTxInfo)({
|
|
52
52
|
deps,
|
|
53
53
|
sellAsset,
|
|
@@ -77,7 +77,7 @@ const buildTrade = async ({ deps, input, }) => {
|
|
|
77
77
|
txData: buildTxResponse.txToSign,
|
|
78
78
|
};
|
|
79
79
|
}
|
|
80
|
-
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.
|
|
80
|
+
else if (chainNamespace === caip_1.CHAIN_NAMESPACE.CosmosSdk) {
|
|
81
81
|
const txData = await (0, cosmosTxData_1.cosmosTxData)({
|
|
82
82
|
deps,
|
|
83
83
|
sellAdapter: sellAdapter,
|
|
@@ -42,7 +42,7 @@ const getThorTradeQuote = async ({ deps, input }) => {
|
|
|
42
42
|
};
|
|
43
43
|
const { chainNamespace } = (0, caip_1.fromAssetId)(sellAsset.assetId);
|
|
44
44
|
switch (chainNamespace) {
|
|
45
|
-
case caip_1.CHAIN_NAMESPACE.
|
|
45
|
+
case caip_1.CHAIN_NAMESPACE.Evm:
|
|
46
46
|
return (async () => {
|
|
47
47
|
const { router } = await (0, getThorTxData_2.getThorTxInfo)({
|
|
48
48
|
deps,
|
|
@@ -64,7 +64,7 @@ const getThorTradeQuote = async ({ deps, input }) => {
|
|
|
64
64
|
feeData,
|
|
65
65
|
};
|
|
66
66
|
})();
|
|
67
|
-
case caip_1.CHAIN_NAMESPACE.
|
|
67
|
+
case caip_1.CHAIN_NAMESPACE.Utxo:
|
|
68
68
|
return (async () => {
|
|
69
69
|
const { vault, opReturnData, pubkey } = await (0, getThorTxData_1.getThorTxInfo)({
|
|
70
70
|
deps,
|
|
@@ -90,7 +90,7 @@ const getThorTradeQuote = async ({ deps, input }) => {
|
|
|
90
90
|
feeData,
|
|
91
91
|
};
|
|
92
92
|
})();
|
|
93
|
-
case caip_1.CHAIN_NAMESPACE.
|
|
93
|
+
case caip_1.CHAIN_NAMESPACE.CosmosSdk:
|
|
94
94
|
return (async () => {
|
|
95
95
|
const feeData = await sellAdapter.getFeeData({});
|
|
96
96
|
return {
|
|
@@ -14,7 +14,7 @@ const thorTradeApprovalNeeded = async ({ deps, input, }) => {
|
|
|
14
14
|
const { adapterManager, web3 } = deps;
|
|
15
15
|
const { assetReference: sellAssetErc20Address } = (0, caip_1.fromAssetId)(sellAsset.assetId);
|
|
16
16
|
const { chainNamespace } = (0, caip_1.fromChainId)(sellAsset.chainId);
|
|
17
|
-
if (chainNamespace !== caip_1.CHAIN_NAMESPACE.
|
|
17
|
+
if (chainNamespace !== caip_1.CHAIN_NAMESPACE.Evm)
|
|
18
18
|
return { approvalNeeded: false };
|
|
19
19
|
const accountNumber = quote.sellAssetAccountNumber;
|
|
20
20
|
const adapter = adapterManager.get(sellAsset.chainId);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shapeshiftoss/swapper",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.0.0",
|
|
4
4
|
"description": "An interface and implementations to trade coins via various protocols",
|
|
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": "^7.1.0",
|
|
34
|
-
"@shapeshiftoss/caip": "^
|
|
34
|
+
"@shapeshiftoss/caip": "^7.0.0",
|
|
35
35
|
"@shapeshiftoss/chain-adapters": "^7.13.0",
|
|
36
36
|
"@shapeshiftoss/errors": "^1.1.2",
|
|
37
37
|
"@shapeshiftoss/hdwallet-core": "^1.27.0",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@shapeshiftoss/asset-service": "^7.1.0",
|
|
42
|
-
"@shapeshiftoss/caip": "^
|
|
42
|
+
"@shapeshiftoss/caip": "^7.0.0",
|
|
43
43
|
"@shapeshiftoss/chain-adapters": "^7.13.0",
|
|
44
44
|
"@shapeshiftoss/errors": "^1.1.2",
|
|
45
45
|
"@shapeshiftoss/hdwallet-core": "^1.27.0",
|