@shapeshiftoss/unchained-client 5.2.0 → 6.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/README.md +32 -4
- package/dist/bitcoin/index.d.ts +3 -2
- package/dist/bitcoin/index.d.ts.map +1 -1
- package/dist/bitcoin/index.js +5 -14
- package/dist/bitcoin/index.js.map +1 -1
- package/dist/bitcoin/parser/index.d.ts +13 -0
- package/dist/bitcoin/parser/index.d.ts.map +1 -0
- package/dist/bitcoin/parser/index.js +74 -0
- package/dist/bitcoin/parser/index.js.map +1 -0
- package/dist/bitcoin/parser/utils.d.ts +4 -0
- package/dist/bitcoin/parser/utils.d.ts.map +1 -0
- package/dist/bitcoin/parser/utils.js +16 -0
- package/dist/bitcoin/parser/utils.js.map +1 -0
- package/dist/bitcoin/types.d.ts +2 -0
- package/dist/bitcoin/types.d.ts.map +1 -0
- package/dist/bitcoin/types.js +3 -0
- package/dist/bitcoin/types.js.map +1 -0
- package/dist/cosmos/index.d.ts +2 -1
- package/dist/cosmos/index.d.ts.map +1 -1
- package/dist/cosmos/index.js +4 -13
- package/dist/cosmos/index.js.map +1 -1
- package/dist/cosmos/parser/index.d.ts +13 -0
- package/dist/cosmos/parser/index.d.ts.map +1 -0
- package/dist/cosmos/parser/index.js +67 -0
- package/dist/cosmos/parser/index.js.map +1 -0
- package/dist/ethereum/index.d.ts +3 -2
- package/dist/ethereum/index.d.ts.map +1 -1
- package/dist/ethereum/index.js +5 -14
- package/dist/ethereum/index.js.map +1 -1
- package/dist/ethereum/parser/abi/erc20.d.ts +4 -0
- package/dist/ethereum/parser/abi/erc20.d.ts.map +1 -0
- package/dist/ethereum/parser/abi/erc20.js +292 -0
- package/dist/ethereum/parser/abi/erc20.js.map +1 -0
- package/dist/ethereum/parser/abi/multiSig.d.ts +4 -0
- package/dist/ethereum/parser/abi/multiSig.d.ts.map +1 -0
- package/dist/ethereum/parser/abi/multiSig.js +369 -0
- package/dist/ethereum/parser/abi/multiSig.js.map +1 -0
- package/dist/ethereum/parser/abi/shapeShiftRouter.d.ts +4 -0
- package/dist/ethereum/parser/abi/shapeShiftRouter.d.ts.map +1 -0
- package/dist/ethereum/parser/abi/shapeShiftRouter.js +495 -0
- package/dist/ethereum/parser/abi/shapeShiftRouter.js.map +1 -0
- package/dist/ethereum/parser/abi/thor.d.ts +4 -0
- package/dist/ethereum/parser/abi/thor.d.ts.map +1 -0
- package/dist/ethereum/parser/abi/thor.js +155 -0
- package/dist/ethereum/parser/abi/thor.js.map +1 -0
- package/dist/ethereum/parser/abi/uniV2.d.ts +4 -0
- package/dist/ethereum/parser/abi/uniV2.d.ts.map +1 -0
- package/dist/ethereum/parser/abi/uniV2.js +344 -0
- package/dist/ethereum/parser/abi/uniV2.js.map +1 -0
- package/dist/ethereum/parser/abi/yearnVault.d.ts +4 -0
- package/dist/ethereum/parser/abi/yearnVault.d.ts.map +1 -0
- package/dist/ethereum/parser/abi/yearnVault.js +648 -0
- package/dist/ethereum/parser/abi/yearnVault.js.map +1 -0
- package/dist/ethereum/parser/constants.d.ts +6 -0
- package/dist/ethereum/parser/constants.d.ts.map +1 -0
- package/dist/ethereum/parser/constants.js +9 -0
- package/dist/ethereum/parser/constants.js.map +1 -0
- package/dist/ethereum/parser/index.d.ts +21 -0
- package/dist/ethereum/parser/index.d.ts.map +1 -0
- package/dist/ethereum/parser/index.js +185 -0
- package/dist/ethereum/parser/index.js.map +1 -0
- package/dist/ethereum/parser/thor.d.ts +18 -0
- package/dist/ethereum/parser/thor.d.ts.map +1 -0
- package/dist/ethereum/parser/thor.js +81 -0
- package/dist/ethereum/parser/thor.js.map +1 -0
- package/dist/ethereum/parser/uniV2.d.ts +21 -0
- package/dist/ethereum/parser/uniV2.d.ts.map +1 -0
- package/dist/ethereum/parser/uniV2.js +130 -0
- package/dist/ethereum/parser/uniV2.js.map +1 -0
- package/dist/ethereum/parser/utils.d.ts +9 -0
- package/dist/ethereum/parser/utils.d.ts.map +1 -0
- package/dist/ethereum/parser/utils.js +47 -0
- package/dist/ethereum/parser/utils.js.map +1 -0
- package/dist/ethereum/parser/yearn.d.ts +24 -0
- package/dist/ethereum/parser/yearn.d.ts.map +1 -0
- package/dist/ethereum/parser/yearn.js +84 -0
- package/dist/ethereum/parser/yearn.js.map +1 -0
- package/dist/ethereum/parser/zrx.d.ts +7 -0
- package/dist/ethereum/parser/zrx.d.ts.map +1 -0
- package/dist/ethereum/parser/zrx.js +39 -0
- package/dist/ethereum/parser/zrx.js.map +1 -0
- package/dist/ethereum/types.d.ts +31 -0
- package/dist/ethereum/types.d.ts.map +1 -0
- package/dist/ethereum/types.js +3 -0
- package/dist/ethereum/types.js.map +1 -0
- package/dist/generated/bitcoin/api.d.ts +8 -8
- package/dist/generated/bitcoin/api.js +1 -1
- package/dist/generated/bitcoin/base.d.ts +1 -1
- package/dist/generated/bitcoin/base.js +1 -1
- package/dist/generated/bitcoin/common.d.ts +2 -2
- package/dist/generated/bitcoin/common.d.ts.map +1 -1
- package/dist/generated/bitcoin/common.js +1 -1
- package/dist/generated/bitcoin/configuration.d.ts +1 -1
- package/dist/generated/bitcoin/configuration.js +1 -1
- package/dist/generated/bitcoin/index.d.ts +1 -1
- package/dist/generated/bitcoin/index.js +1 -1
- package/dist/generated/cosmos/api.d.ts +43 -67
- package/dist/generated/cosmos/api.d.ts.map +1 -1
- package/dist/generated/cosmos/api.js +14 -14
- package/dist/generated/cosmos/api.js.map +1 -1
- package/dist/generated/cosmos/common.d.ts +1 -1
- package/dist/generated/cosmos/common.d.ts.map +1 -1
- package/dist/generated/ethereum/api.d.ts +7 -7
- package/dist/generated/ethereum/api.js +1 -1
- package/dist/generated/ethereum/base.d.ts +1 -1
- package/dist/generated/ethereum/base.js +1 -1
- package/dist/generated/ethereum/common.d.ts +2 -2
- package/dist/generated/ethereum/common.d.ts.map +1 -1
- package/dist/generated/ethereum/common.js +1 -1
- package/dist/generated/ethereum/configuration.d.ts +1 -1
- package/dist/generated/ethereum/configuration.js +1 -1
- package/dist/generated/ethereum/index.d.ts +1 -1
- package/dist/generated/ethereum/index.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +3150 -261
- package/dist/types.d.ts +74 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +26 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +43 -0
- package/dist/utils.js.map +1 -0
- package/dist/{bitcoin/websocket.d.ts → websocket.d.ts} +8 -7
- package/dist/websocket.d.ts.map +1 -0
- package/dist/{ethereum/websocket.js → websocket.js} +9 -8
- package/dist/websocket.js.map +1 -0
- package/package.json +10 -6
- package/dist/bitcoin/websocket.d.ts.map +0 -1
- package/dist/bitcoin/websocket.js +0 -177
- package/dist/bitcoin/websocket.js.map +0 -1
- package/dist/ethereum/websocket.d.ts +0 -61
- package/dist/ethereum/websocket.d.ts.map +0 -1
- package/dist/ethereum/websocket.js.map +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.THOR_ROUTER_CONTRACT_ROPSTEN = exports.THOR_ROUTER_CONTRACT_MAINNET = exports.ZRX_PROXY_CONTRACT = exports.UNI_V2_ROUTER_CONTRACT = exports.SHAPE_SHIFT_ROUTER_CONTRACT = void 0;
|
|
4
|
+
exports.SHAPE_SHIFT_ROUTER_CONTRACT = '0x6a1e73f12018D8e5f966ce794aa2921941feB17E';
|
|
5
|
+
exports.UNI_V2_ROUTER_CONTRACT = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D';
|
|
6
|
+
exports.ZRX_PROXY_CONTRACT = '0xDef1C0ded9bec7F1a1670819833240f027b25EfF';
|
|
7
|
+
exports.THOR_ROUTER_CONTRACT_MAINNET = '0xC145990E84155416144C532E31f89B840Ca8c2cE';
|
|
8
|
+
exports.THOR_ROUTER_CONTRACT_ROPSTEN = '0xefA28233838f46a80AaaC8c309077a9ba70D123A';
|
|
9
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/ethereum/parser/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,2BAA2B,GAAG,4CAA4C,CAAA;AAC1E,QAAA,sBAAsB,GAAG,4CAA4C,CAAA;AACrE,QAAA,kBAAkB,GAAG,4CAA4C,CAAA;AACjE,QAAA,4BAA4B,GAAG,4CAA4C,CAAA;AAC3E,QAAA,4BAA4B,GAAG,4CAA4C,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Tx as BlockbookTx } from '@shapeshiftoss/blockbook';
|
|
2
|
+
import { Tx as ParsedTx } from '../../types';
|
|
3
|
+
import { InternalTx, Network } from '../types';
|
|
4
|
+
export interface TransactionParserArgs {
|
|
5
|
+
network?: Network;
|
|
6
|
+
rpcUrl: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class TransactionParser {
|
|
9
|
+
network: Network;
|
|
10
|
+
private readonly thor;
|
|
11
|
+
private readonly uniV2;
|
|
12
|
+
private readonly zrx;
|
|
13
|
+
private readonly yearn;
|
|
14
|
+
private readonly parsers;
|
|
15
|
+
constructor(args: TransactionParserArgs);
|
|
16
|
+
getInternalAddress(inputData: string): string | undefined;
|
|
17
|
+
parse(tx: BlockbookTx, address: string, internalTxs?: Array<InternalTx>): Promise<ParsedTx>;
|
|
18
|
+
private static getStatus;
|
|
19
|
+
private getParsedTxWithTransfers;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ethereum/parser/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAA8C,EAAE,IAAI,QAAQ,EAAc,MAAM,aAAa,CAAA;AAEpG,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAO9C,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,iBAAiB;IAC5B,OAAO,EAAE,OAAO,CAAA;IAEhB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;gBAE/C,IAAI,EAAE,qBAAqB;IAcvC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAWnD,KAAK,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyBjG,OAAO,CAAC,MAAM,CAAC,SAAS;IAUxB,OAAO,CAAC,wBAAwB;CAmHjC"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
25
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
26
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
27
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.TransactionParser = void 0;
|
|
32
|
+
const bignumber_js_1 = require("bignumber.js");
|
|
33
|
+
const ethers_1 = require("ethers");
|
|
34
|
+
const caip_1 = require("@shapeshiftoss/caip");
|
|
35
|
+
const types_1 = require("@shapeshiftoss/types");
|
|
36
|
+
const types_2 = require("../../types");
|
|
37
|
+
const utils_1 = require("../../utils");
|
|
38
|
+
const utils_2 = require("./utils");
|
|
39
|
+
const thor = __importStar(require("./thor"));
|
|
40
|
+
const uniV2 = __importStar(require("./uniV2"));
|
|
41
|
+
const zrx = __importStar(require("./zrx"));
|
|
42
|
+
const yearn = __importStar(require("./yearn"));
|
|
43
|
+
class TransactionParser {
|
|
44
|
+
constructor(args) {
|
|
45
|
+
var _a;
|
|
46
|
+
const provider = new ethers_1.ethers.providers.JsonRpcProvider(args.rpcUrl);
|
|
47
|
+
this.network = (_a = args.network) !== null && _a !== void 0 ? _a : 'mainnet';
|
|
48
|
+
this.thor = new thor.Parser({ network: this.network, rpcUrl: args.rpcUrl });
|
|
49
|
+
this.uniV2 = new uniV2.Parser({ network: this.network, provider });
|
|
50
|
+
this.zrx = new zrx.Parser();
|
|
51
|
+
this.yearn = new yearn.Parser({ provider, network: this.network });
|
|
52
|
+
this.parsers = [this.zrx, this.thor, this.uniV2, this.yearn];
|
|
53
|
+
}
|
|
54
|
+
// return any addresses that can be detected
|
|
55
|
+
getInternalAddress(inputData) {
|
|
56
|
+
switch (utils_2.getSigHash(inputData)) {
|
|
57
|
+
case this.thor.transferOutSigHash:
|
|
58
|
+
return this.thor.getInternalAddress(inputData);
|
|
59
|
+
case utils_2.SENDMULTISIG_SIG_HASH:
|
|
60
|
+
return utils_2.getInternalMultisigAddress(inputData);
|
|
61
|
+
default:
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
parse(tx, address, internalTxs) {
|
|
66
|
+
var _a;
|
|
67
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
// We expect only one Parser to return a result. If multiple do, we take the first and early exit.
|
|
69
|
+
const contractParserResult = yield utils_1.findAsyncSequential(this.parsers, (parser) => __awaiter(this, void 0, void 0, function* () { return yield parser.parse(tx); }));
|
|
70
|
+
const parsedTx = {
|
|
71
|
+
address,
|
|
72
|
+
blockHash: tx.blockHash,
|
|
73
|
+
blockHeight: tx.blockHeight,
|
|
74
|
+
blockTime: tx.blockTime,
|
|
75
|
+
caip2: caip_1.caip2.toCAIP2({ chain: types_1.ChainTypes.Ethereum, network: utils_2.toNetworkType(this.network) }),
|
|
76
|
+
confirmations: tx.confirmations,
|
|
77
|
+
status: TransactionParser.getStatus(tx),
|
|
78
|
+
trade: contractParserResult === null || contractParserResult === void 0 ? void 0 : contractParserResult.trade,
|
|
79
|
+
transfers: (_a = contractParserResult === null || contractParserResult === void 0 ? void 0 : contractParserResult.transfers) !== null && _a !== void 0 ? _a : [],
|
|
80
|
+
txid: tx.txid,
|
|
81
|
+
value: tx.value,
|
|
82
|
+
data: contractParserResult === null || contractParserResult === void 0 ? void 0 : contractParserResult.data,
|
|
83
|
+
};
|
|
84
|
+
return this.getParsedTxWithTransfers(tx, parsedTx, address, internalTxs);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
static getStatus(tx) {
|
|
88
|
+
var _a;
|
|
89
|
+
const status = (_a = tx.ethereumSpecific) === null || _a === void 0 ? void 0 : _a.status;
|
|
90
|
+
if (status === -1 && tx.confirmations <= 0)
|
|
91
|
+
return types_2.Status.Pending;
|
|
92
|
+
if (status === 1 && tx.confirmations > 0)
|
|
93
|
+
return types_2.Status.Confirmed;
|
|
94
|
+
if (status === 0)
|
|
95
|
+
return types_2.Status.Failed;
|
|
96
|
+
return types_2.Status.Unknown;
|
|
97
|
+
}
|
|
98
|
+
getParsedTxWithTransfers(tx, parsedTx, address, internalTxs) {
|
|
99
|
+
var _a, _b, _c, _d, _e, _f;
|
|
100
|
+
const caip19Ethereum = caip_1.caip19.toCAIP19({
|
|
101
|
+
chain: types_1.ChainTypes.Ethereum,
|
|
102
|
+
network: utils_2.toNetworkType(this.network),
|
|
103
|
+
assetNamespace: caip_1.AssetNamespace.Slip44,
|
|
104
|
+
assetReference: caip_1.AssetReference.Ethereum,
|
|
105
|
+
});
|
|
106
|
+
const sendAddress = (_b = (_a = tx.vin[0].addresses) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : '';
|
|
107
|
+
const receiveAddress = (_d = (_c = tx.vout[0].addresses) === null || _c === void 0 ? void 0 : _c[0]) !== null && _d !== void 0 ? _d : '';
|
|
108
|
+
if (address === sendAddress) {
|
|
109
|
+
// send amount
|
|
110
|
+
const sendValue = new bignumber_js_1.BigNumber(tx.value);
|
|
111
|
+
if (sendValue.gt(0)) {
|
|
112
|
+
parsedTx.transfers = utils_1.aggregateTransfer(parsedTx.transfers, types_2.TransferType.Send, caip19Ethereum, sendAddress, receiveAddress, sendValue.toString(10));
|
|
113
|
+
}
|
|
114
|
+
// network fee
|
|
115
|
+
const fees = new bignumber_js_1.BigNumber((_e = tx.fees) !== null && _e !== void 0 ? _e : 0);
|
|
116
|
+
if (fees.gt(0)) {
|
|
117
|
+
parsedTx.fee = { caip19: caip19Ethereum, value: fees.toString(10) };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (address === receiveAddress) {
|
|
121
|
+
// receive amount
|
|
122
|
+
const receiveValue = new bignumber_js_1.BigNumber(tx.value);
|
|
123
|
+
if (receiveValue.gt(0)) {
|
|
124
|
+
parsedTx.transfers = utils_1.aggregateTransfer(parsedTx.transfers, types_2.TransferType.Receive, caip19Ethereum, sendAddress, receiveAddress, receiveValue.toString(10));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
(_f = tx.tokenTransfers) === null || _f === void 0 ? void 0 : _f.forEach((transfer) => {
|
|
128
|
+
// FTX Token (FTT) name and symbol was set backwards on the ERC20 contract
|
|
129
|
+
if (transfer.token == '0x50D1c9771902476076eCFc8B2A83Ad6b9355a4c9') {
|
|
130
|
+
transfer.name = transfer.symbol;
|
|
131
|
+
transfer.symbol = transfer.name;
|
|
132
|
+
}
|
|
133
|
+
const token = {
|
|
134
|
+
contract: transfer.token,
|
|
135
|
+
decimals: transfer.decimals,
|
|
136
|
+
name: transfer.name,
|
|
137
|
+
symbol: transfer.symbol,
|
|
138
|
+
};
|
|
139
|
+
const transferArgs = [
|
|
140
|
+
caip_1.caip19.toCAIP19({
|
|
141
|
+
chain: types_1.ChainTypes.Ethereum,
|
|
142
|
+
network: utils_2.toNetworkType(this.network),
|
|
143
|
+
assetNamespace: caip_1.AssetNamespace.ERC20,
|
|
144
|
+
assetReference: transfer.token,
|
|
145
|
+
}),
|
|
146
|
+
transfer.from,
|
|
147
|
+
transfer.to,
|
|
148
|
+
transfer.value,
|
|
149
|
+
token,
|
|
150
|
+
];
|
|
151
|
+
// token send amount
|
|
152
|
+
if (address === transfer.from) {
|
|
153
|
+
parsedTx.transfers = utils_1.aggregateTransfer(parsedTx.transfers, types_2.TransferType.Send, ...transferArgs);
|
|
154
|
+
}
|
|
155
|
+
// token receive amount
|
|
156
|
+
if (address === transfer.to) {
|
|
157
|
+
parsedTx.transfers = utils_1.aggregateTransfer(parsedTx.transfers, types_2.TransferType.Receive, ...transferArgs);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
internalTxs === null || internalTxs === void 0 ? void 0 : internalTxs.forEach((internalTx) => {
|
|
161
|
+
const transferArgs = [
|
|
162
|
+
caip_1.caip19.toCAIP19({
|
|
163
|
+
chain: types_1.ChainTypes.Ethereum,
|
|
164
|
+
network: utils_2.toNetworkType(this.network),
|
|
165
|
+
assetNamespace: caip_1.AssetNamespace.Slip44,
|
|
166
|
+
assetReference: caip_1.AssetReference.Ethereum,
|
|
167
|
+
}),
|
|
168
|
+
internalTx.from,
|
|
169
|
+
internalTx.to,
|
|
170
|
+
internalTx.value,
|
|
171
|
+
];
|
|
172
|
+
// internal eth send
|
|
173
|
+
if (address === internalTx.from) {
|
|
174
|
+
parsedTx.transfers = utils_1.aggregateTransfer(parsedTx.transfers, types_2.TransferType.Send, ...transferArgs);
|
|
175
|
+
}
|
|
176
|
+
// internal eth receive
|
|
177
|
+
if (address === internalTx.to) {
|
|
178
|
+
parsedTx.transfers = utils_1.aggregateTransfer(parsedTx.transfers, types_2.TransferType.Receive, ...transferArgs);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
return parsedTx;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.TransactionParser = TransactionParser;
|
|
185
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ethereum/parser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ethers } from 'ethers';
|
|
2
|
+
import { Tx as BlockbookTx } from '@shapeshiftoss/blockbook';
|
|
3
|
+
import { GenericParser, TxSpecific } from '../../types';
|
|
4
|
+
import { Network, ThorTx } from '../types';
|
|
5
|
+
export interface ParserArgs {
|
|
6
|
+
network: Network;
|
|
7
|
+
rpcUrl: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class Parser implements GenericParser<BlockbookTx> {
|
|
10
|
+
abiInterface: ethers.utils.Interface;
|
|
11
|
+
readonly depositSigHash: string;
|
|
12
|
+
readonly transferOutSigHash: string;
|
|
13
|
+
readonly routerContract: string;
|
|
14
|
+
constructor(args: ParserArgs);
|
|
15
|
+
getInternalAddress(inputData: string): string | undefined;
|
|
16
|
+
parse(tx: BlockbookTx): Promise<TxSpecific<ThorTx> | undefined>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=thor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thor.d.ts","sourceRoot":"","sources":["../../../src/ethereum/parser/thor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAO,aAAa,EAAa,UAAU,EAAE,MAAM,aAAa,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAO1C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,MAAO,YAAW,aAAa,CAAC,WAAW,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAA;IAEpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;gBAEnB,IAAI,EAAE,UAAU;IAc5B,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAWnD,KAAK,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;CAsCtE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Parser = void 0;
|
|
16
|
+
const ethers_1 = require("ethers");
|
|
17
|
+
const types_1 = require("../../types");
|
|
18
|
+
const thor_1 = __importDefault(require("./abi/thor"));
|
|
19
|
+
const utils_1 = require("./utils");
|
|
20
|
+
const constants_1 = require("./constants");
|
|
21
|
+
const SWAP_TYPES = ['SWAP', '=', 's'];
|
|
22
|
+
class Parser {
|
|
23
|
+
constructor(args) {
|
|
24
|
+
this.abiInterface = new ethers_1.ethers.utils.Interface(thor_1.default);
|
|
25
|
+
this.depositSigHash = this.abiInterface.getSighash('deposit');
|
|
26
|
+
this.transferOutSigHash = this.abiInterface.getSighash('transferOut');
|
|
27
|
+
// TODO: Router contract can change, use /inbound_addresses endpoint to determine current router contract
|
|
28
|
+
this.routerContract = {
|
|
29
|
+
mainnet: constants_1.THOR_ROUTER_CONTRACT_MAINNET,
|
|
30
|
+
ropsten: constants_1.THOR_ROUTER_CONTRACT_ROPSTEN,
|
|
31
|
+
}[args.network];
|
|
32
|
+
}
|
|
33
|
+
// detect address associated with transferOut internal transaction
|
|
34
|
+
getInternalAddress(inputData) {
|
|
35
|
+
if (utils_1.getSigHash(inputData) !== this.transferOutSigHash)
|
|
36
|
+
return;
|
|
37
|
+
const result = this.abiInterface.decodeFunctionData(this.transferOutSigHash, inputData);
|
|
38
|
+
const [type] = result.memo.split(':');
|
|
39
|
+
if (type !== 'OUT' || type !== 'REFUND')
|
|
40
|
+
return;
|
|
41
|
+
return result.to;
|
|
42
|
+
}
|
|
43
|
+
parse(tx) {
|
|
44
|
+
var _a;
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const txData = (_a = tx.ethereumSpecific) === null || _a === void 0 ? void 0 : _a.data;
|
|
47
|
+
if (!utils_1.txInteractsWithContract(tx, this.routerContract))
|
|
48
|
+
return;
|
|
49
|
+
if (!txData)
|
|
50
|
+
return;
|
|
51
|
+
const decoded = this.abiInterface.parseTransaction({ data: txData });
|
|
52
|
+
const result = (() => {
|
|
53
|
+
switch (utils_1.getSigHash(txData)) {
|
|
54
|
+
case this.depositSigHash:
|
|
55
|
+
case this.transferOutSigHash:
|
|
56
|
+
return decoded.args;
|
|
57
|
+
default:
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
// We didn't recognise the sigHash - exit
|
|
62
|
+
if (!result)
|
|
63
|
+
return;
|
|
64
|
+
const data = {
|
|
65
|
+
method: decoded.name,
|
|
66
|
+
parser: 'thor',
|
|
67
|
+
};
|
|
68
|
+
const [type] = result.memo.split(':');
|
|
69
|
+
if (SWAP_TYPES.includes(type) || type === 'OUT') {
|
|
70
|
+
return { trade: { dexName: types_1.Dex.Thor, type: types_1.TradeType.Trade, memo: result.memo }, data };
|
|
71
|
+
}
|
|
72
|
+
if (type === 'REFUND') {
|
|
73
|
+
return { trade: { dexName: types_1.Dex.Thor, type: types_1.TradeType.Refund, memo: result.memo }, data };
|
|
74
|
+
}
|
|
75
|
+
// We encountered a case we thought we'd support, but don't - exit
|
|
76
|
+
return;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.Parser = Parser;
|
|
81
|
+
//# sourceMappingURL=thor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thor.js","sourceRoot":"","sources":["../../../src/ethereum/parser/thor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Tx as BlockbookTx } from '@shapeshiftoss/blockbook';
|
|
2
|
+
import { ethers } from 'ethers';
|
|
3
|
+
import { GenericParser, TxSpecific } from '../../types';
|
|
4
|
+
import { Network, UniV2Tx } from '../types';
|
|
5
|
+
export interface ParserArgs {
|
|
6
|
+
network: Network;
|
|
7
|
+
provider: ethers.providers.JsonRpcProvider;
|
|
8
|
+
}
|
|
9
|
+
export declare class Parser implements GenericParser<BlockbookTx> {
|
|
10
|
+
abiInterface: ethers.utils.Interface;
|
|
11
|
+
network: Network;
|
|
12
|
+
provider: ethers.providers.JsonRpcProvider;
|
|
13
|
+
readonly addLiquidityEthSigHash: string;
|
|
14
|
+
readonly removeLiquidityEthSigHash: string;
|
|
15
|
+
readonly wethContract: string;
|
|
16
|
+
constructor(args: ParserArgs);
|
|
17
|
+
parse(tx: BlockbookTx): Promise<TxSpecific<UniV2Tx> | undefined>;
|
|
18
|
+
private static pairFor;
|
|
19
|
+
private getTransfers;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=uniV2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniV2.d.ts","sourceRoot":"","sources":["../../../src/ethereum/parser/uniV2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,aAAa,EAA0B,UAAU,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAM3C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,eAAe,CAAA;CAC3C;AAED,qBAAa,MAAO,YAAW,aAAa,CAAC,WAAW,CAAC;IACvD,YAAY,yBAAwC;IACpD,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,eAAe,CAAA;IAE1C,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAA;IACvC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;gBAEjB,IAAI,EAAE,UAAU;IAYtB,KAAK,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAiBtE,OAAO,CAAC,MAAM,CAAC,OAAO;YAQR,YAAY;CAiE3B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Parser = void 0;
|
|
16
|
+
const caip_1 = require("@shapeshiftoss/caip");
|
|
17
|
+
const types_1 = require("@shapeshiftoss/types");
|
|
18
|
+
const ethers_1 = require("ethers");
|
|
19
|
+
const types_2 = require("../../types");
|
|
20
|
+
const uniV2_1 = __importDefault(require("./abi/uniV2"));
|
|
21
|
+
const erc20_1 = __importDefault(require("./abi/erc20"));
|
|
22
|
+
const utils_1 = require("./utils");
|
|
23
|
+
const constants_1 = require("./constants");
|
|
24
|
+
class Parser {
|
|
25
|
+
constructor(args) {
|
|
26
|
+
this.abiInterface = new ethers_1.ethers.utils.Interface(uniV2_1.default);
|
|
27
|
+
this.network = args.network;
|
|
28
|
+
this.provider = args.provider;
|
|
29
|
+
this.addLiquidityEthSigHash = this.abiInterface.getSighash('addLiquidityETH');
|
|
30
|
+
this.removeLiquidityEthSigHash = this.abiInterface.getSighash('removeLiquidityETH');
|
|
31
|
+
this.wethContract = {
|
|
32
|
+
mainnet: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
|
|
33
|
+
ropsten: '0xc778417E063141139Fce010982780140Aa0cD5Ab',
|
|
34
|
+
}[this.network];
|
|
35
|
+
}
|
|
36
|
+
parse(tx) {
|
|
37
|
+
var _a;
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
if (!((_a = tx.ethereumSpecific) === null || _a === void 0 ? void 0 : _a.data))
|
|
40
|
+
return;
|
|
41
|
+
if (!utils_1.txInteractsWithContract(tx, constants_1.UNI_V2_ROUTER_CONTRACT))
|
|
42
|
+
return;
|
|
43
|
+
if (!(tx.confirmations === 0))
|
|
44
|
+
return;
|
|
45
|
+
const transfers = yield this.getTransfers(tx);
|
|
46
|
+
const decoded = this.abiInterface.parseTransaction({ data: tx.ethereumSpecific.data });
|
|
47
|
+
return {
|
|
48
|
+
transfers,
|
|
49
|
+
data: {
|
|
50
|
+
parser: 'uniV2',
|
|
51
|
+
method: decoded.name,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
static pairFor(tokenA, tokenB) {
|
|
57
|
+
const [token0, token1] = tokenA < tokenB ? [tokenA, tokenB] : [tokenB, tokenA];
|
|
58
|
+
const factoryContract = '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f';
|
|
59
|
+
const salt = ethers_1.ethers.utils.solidityKeccak256(['address', 'address'], [token0, token1]);
|
|
60
|
+
const initCodeHash = '0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f'; // https://github.com/Uniswap/v2-periphery/blob/dda62473e2da448bc9cb8f4514dadda4aeede5f4/contracts/libraries/UniswapV2Library.sol#L24
|
|
61
|
+
return ethers_1.ethers.utils.getCreate2Address(factoryContract, salt, initCodeHash);
|
|
62
|
+
}
|
|
63
|
+
getTransfers(tx) {
|
|
64
|
+
var _a, _b, _c;
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
const data = (_a = tx.ethereumSpecific) === null || _a === void 0 ? void 0 : _a.data;
|
|
67
|
+
if (!data)
|
|
68
|
+
return;
|
|
69
|
+
const sendAddress = (_c = (_b = tx.vin[0].addresses) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : '';
|
|
70
|
+
switch (utils_1.getSigHash(data)) {
|
|
71
|
+
case this.addLiquidityEthSigHash: {
|
|
72
|
+
const result = this.abiInterface.decodeFunctionData(this.addLiquidityEthSigHash, data);
|
|
73
|
+
const tokenAddress = ethers_1.ethers.utils.getAddress(result.token.toLowerCase());
|
|
74
|
+
const lpTokenAddress = Parser.pairFor(tokenAddress, this.wethContract);
|
|
75
|
+
const contract = new ethers_1.ethers.Contract(tokenAddress, erc20_1.default, this.provider);
|
|
76
|
+
const decimals = yield contract.decimals();
|
|
77
|
+
const name = yield contract.name();
|
|
78
|
+
const symbol = yield contract.symbol();
|
|
79
|
+
const value = result.amountTokenDesired.toString();
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
type: types_2.TransferType.Send,
|
|
83
|
+
from: sendAddress,
|
|
84
|
+
to: lpTokenAddress,
|
|
85
|
+
caip19: caip_1.caip19.toCAIP19({
|
|
86
|
+
chain: types_1.ChainTypes.Ethereum,
|
|
87
|
+
network: utils_1.toNetworkType(this.network),
|
|
88
|
+
assetNamespace: caip_1.AssetNamespace.ERC20,
|
|
89
|
+
assetReference: tokenAddress,
|
|
90
|
+
}),
|
|
91
|
+
totalValue: value,
|
|
92
|
+
components: [{ value }],
|
|
93
|
+
token: { contract: tokenAddress, decimals, name, symbol },
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
case this.removeLiquidityEthSigHash: {
|
|
98
|
+
const result = this.abiInterface.decodeFunctionData(this.removeLiquidityEthSigHash, data);
|
|
99
|
+
const tokenAddress = ethers_1.ethers.utils.getAddress(result.token.toLowerCase());
|
|
100
|
+
const lpTokenAddress = Parser.pairFor(tokenAddress, this.wethContract);
|
|
101
|
+
const contract = new ethers_1.ethers.Contract(lpTokenAddress, erc20_1.default, this.provider);
|
|
102
|
+
const decimals = yield contract.decimals();
|
|
103
|
+
const name = yield contract.name();
|
|
104
|
+
const symbol = yield contract.symbol();
|
|
105
|
+
const value = result.liquidity.toString();
|
|
106
|
+
return [
|
|
107
|
+
{
|
|
108
|
+
type: types_2.TransferType.Send,
|
|
109
|
+
from: sendAddress,
|
|
110
|
+
to: lpTokenAddress,
|
|
111
|
+
caip19: caip_1.caip19.toCAIP19({
|
|
112
|
+
chain: types_1.ChainTypes.Ethereum,
|
|
113
|
+
network: utils_1.toNetworkType(this.network),
|
|
114
|
+
assetNamespace: caip_1.AssetNamespace.ERC20,
|
|
115
|
+
assetReference: lpTokenAddress,
|
|
116
|
+
}),
|
|
117
|
+
totalValue: value,
|
|
118
|
+
components: [{ value }],
|
|
119
|
+
token: { contract: lpTokenAddress, decimals, name, symbol },
|
|
120
|
+
},
|
|
121
|
+
];
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.Parser = Parser;
|
|
130
|
+
//# sourceMappingURL=uniV2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniV2.js","sourceRoot":"","sources":["../../../src/ethereum/parser/uniV2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Tx as BlockbookTx } from '@shapeshiftoss/blockbook';
|
|
2
|
+
import { NetworkTypes } from '@shapeshiftoss/types';
|
|
3
|
+
import { Network } from '../types';
|
|
4
|
+
export declare const toNetworkType: (network: Network) => NetworkTypes;
|
|
5
|
+
export declare const getSigHash: (inputData: string | undefined) => string | undefined;
|
|
6
|
+
export declare const txInteractsWithContract: (tx: BlockbookTx, contract: string) => boolean;
|
|
7
|
+
export declare const SENDMULTISIG_SIG_HASH: string;
|
|
8
|
+
export declare const getInternalMultisigAddress: (inputData: string) => string | undefined;
|
|
9
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/ethereum/parser/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAGlC,eAAO,MAAM,aAAa,YAAa,OAAO,KAAG,YAShD,CAAA;AAED,eAAO,MAAM,UAAU,cAAe,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAInE,CAAA;AAED,eAAO,MAAM,uBAAuB,OAAQ,WAAW,YAAY,MAAM,YAGxE,CAAA;AAED,eAAO,MAAM,qBAAqB,QAG9B,CAAA;AAGJ,eAAO,MAAM,0BAA0B,cAAe,MAAM,KAAG,MAAM,GAAG,SAKvE,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getInternalMultisigAddress = exports.SENDMULTISIG_SIG_HASH = exports.txInteractsWithContract = exports.getSigHash = exports.toNetworkType = void 0;
|
|
7
|
+
const ethers_1 = require("ethers");
|
|
8
|
+
const types_1 = require("@shapeshiftoss/types");
|
|
9
|
+
const multiSig_1 = __importDefault(require("./abi/multiSig"));
|
|
10
|
+
const toNetworkType = (network) => {
|
|
11
|
+
switch (network) {
|
|
12
|
+
case 'mainnet':
|
|
13
|
+
return types_1.NetworkTypes.MAINNET;
|
|
14
|
+
case 'ropsten':
|
|
15
|
+
return types_1.NetworkTypes.ETH_ROPSTEN;
|
|
16
|
+
default:
|
|
17
|
+
throw new Error('unsupported network');
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.toNetworkType = toNetworkType;
|
|
21
|
+
const getSigHash = (inputData) => {
|
|
22
|
+
if (!inputData)
|
|
23
|
+
return;
|
|
24
|
+
const length = inputData.startsWith('0x') ? 10 : 8;
|
|
25
|
+
return inputData.slice(0, length);
|
|
26
|
+
};
|
|
27
|
+
exports.getSigHash = getSigHash;
|
|
28
|
+
const txInteractsWithContract = (tx, contract) => {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
const receiveAddress = (_b = (_a = tx.vout[0].addresses) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : '';
|
|
31
|
+
return receiveAddress === contract;
|
|
32
|
+
};
|
|
33
|
+
exports.txInteractsWithContract = txInteractsWithContract;
|
|
34
|
+
exports.SENDMULTISIG_SIG_HASH = (() => {
|
|
35
|
+
const abiInterface = new ethers_1.ethers.utils.Interface(multiSig_1.default);
|
|
36
|
+
return abiInterface.getSighash('sendMultiSig');
|
|
37
|
+
})();
|
|
38
|
+
// detect address associated with sendMultiSig internal transaction
|
|
39
|
+
const getInternalMultisigAddress = (inputData) => {
|
|
40
|
+
const abiInterface = new ethers_1.ethers.utils.Interface(multiSig_1.default);
|
|
41
|
+
if (exports.getSigHash(inputData) !== exports.SENDMULTISIG_SIG_HASH)
|
|
42
|
+
return;
|
|
43
|
+
const result = abiInterface.decodeFunctionData(exports.SENDMULTISIG_SIG_HASH, inputData);
|
|
44
|
+
return result.toAddress;
|
|
45
|
+
};
|
|
46
|
+
exports.getInternalMultisigAddress = getInternalMultisigAddress;
|
|
47
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/ethereum/parser/utils.ts"],"names":[],"mappings":";;;;;;AAAA,mCAA+B;AAE/B,gDAAmD;AAEnD,8DAAyC;AAElC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAgB,EAAE;IAC9D,QAAQ,OAAO,EAAE;QACf,KAAK,SAAS;YACZ,OAAO,oBAAY,CAAC,OAAO,CAAA;QAC7B,KAAK,SAAS;YACZ,OAAO,oBAAY,CAAC,WAAW,CAAA;QACjC;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;KACzC;AACH,CAAC,CAAA;AATY,QAAA,aAAa,iBASzB;AAEM,MAAM,UAAU,GAAG,CAAC,SAA6B,EAAsB,EAAE;IAC9E,IAAI,CAAC,SAAS;QAAE,OAAM;IACtB,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAClD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AACnC,CAAC,CAAA;AAJY,QAAA,UAAU,cAItB;AAEM,MAAM,uBAAuB,GAAG,CAAC,EAAe,EAAE,QAAgB,EAAE,EAAE;;IAC3E,MAAM,cAAc,GAAG,MAAA,MAAA,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,0CAAG,CAAC,CAAC,mCAAI,EAAE,CAAA;IACtD,OAAO,cAAc,KAAK,QAAQ,CAAA;AACpC,CAAC,CAAA;AAHY,QAAA,uBAAuB,2BAGnC;AAEY,QAAA,qBAAqB,GAAG,CAAC,GAAW,EAAE;IACjD,MAAM,YAAY,GAAG,IAAI,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,kBAAY,CAAC,CAAA;IAC7D,OAAO,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAChD,CAAC,CAAC,EAAE,CAAA;AAEJ,mEAAmE;AAC5D,MAAM,0BAA0B,GAAG,CAAC,SAAiB,EAAsB,EAAE;IAClF,MAAM,YAAY,GAAG,IAAI,eAAM,CAAC,KAAK,CAAC,SAAS,CAAC,kBAAY,CAAC,CAAA;IAC7D,IAAI,kBAAU,CAAC,SAAS,CAAC,KAAK,6BAAqB;QAAE,OAAM;IAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,6BAAqB,EAAE,SAAS,CAAC,CAAA;IAChF,OAAO,MAAM,CAAC,SAAS,CAAA;AACzB,CAAC,CAAA;AALY,QAAA,0BAA0B,8BAKtC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ChainId, Yearn } from '@yfi/sdk';
|
|
2
|
+
import { Tx as BlockbookTx } from '@shapeshiftoss/blockbook';
|
|
3
|
+
import { ethers } from 'ethers';
|
|
4
|
+
import { GenericParser, TxSpecific } from '../../types';
|
|
5
|
+
import { Network, YearnTx } from '../types';
|
|
6
|
+
interface ParserArgs {
|
|
7
|
+
network: Network;
|
|
8
|
+
provider: ethers.providers.JsonRpcProvider;
|
|
9
|
+
}
|
|
10
|
+
export declare class Parser implements GenericParser<BlockbookTx> {
|
|
11
|
+
provider: ethers.providers.JsonRpcProvider;
|
|
12
|
+
yearnSdk: Yearn<ChainId> | undefined;
|
|
13
|
+
yearnTokenVaultAddresses: string[] | undefined;
|
|
14
|
+
shapeShiftInterface: ethers.utils.Interface;
|
|
15
|
+
yearnInterface: ethers.utils.Interface;
|
|
16
|
+
approvalSigHash: string;
|
|
17
|
+
depositSigHash: string;
|
|
18
|
+
withdrawSigHash: string;
|
|
19
|
+
constructor(args: ParserArgs);
|
|
20
|
+
parse(tx: BlockbookTx): Promise<TxSpecific<YearnTx> | undefined>;
|
|
21
|
+
getAbiInterface(txSigHash: string | undefined): ethers.utils.Interface | undefined;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=yearn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yearn.d.ts","sourceRoot":"","sources":["../../../src/ethereum/parser/yearn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,EAAE,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAM3C,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,eAAe,CAAA;CAC3C;AAED,qBAAa,MAAO,YAAW,aAAa,CAAC,WAAW,CAAC;IACvD,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,eAAe,CAAA;IAC1C,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;IAEpC,wBAAwB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAC9C,mBAAmB,yBAA+C;IAClE,cAAc,yBAAyC;IAEvD,eAAe,SAA4C;IAE3D,cAAc,SAAe;IAC7B,eAAe,SAAe;gBAElB,IAAI,EAAE,UAAU;IAUtB,KAAK,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAiCtE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS;CAanF"}
|