@0xtorch/evm 0.0.31 → 0.0.32
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/decoder/decode.ts +1 -0
- package/index.ts +0 -8
- package/package.json +2 -2
- package/getAccountsTransactionFulls/getAccountsTransactionFulls.ts +0 -46
- package/getAccountsTransactionFulls/getAccountsTransactionFullsCustom.ts +0 -106
- package/getAccountsTransactionFulls/getDecodedTransactionsPrices.ts +0 -97
- package/getAccountsTransactionFulls/getHashesAndInternalTxs.ts +0 -65
- package/getAccountsTransactionFulls/getTransactionDetails.ts +0 -41
- package/getAccountsTransactionFulls/getTransactionsApps.ts +0 -42
- package/getAccountsTransactionFulls/index.ts +0 -2
- package/getAccountsTransactionFulls/types.ts +0 -122
- package/getAccountsTransactionFulls/withD.ts +0 -80
- package/getAccountsTransactionFulls/withDA.ts +0 -112
- package/getAccountsTransactionFulls/withP.ts +0 -120
- package/getAccountsTransactionFulls/withPD.ts +0 -141
- package/getAccountsTransactionFulls/withPDA.ts +0 -167
- package/getAccountsTransactionFulls/withUndefined.ts +0 -88
- package/getTransactionFull/getTransactionFull.ts +0 -30
- package/getTransactionFull/getTransactionFullCustom.ts +0 -91
- package/getTransactionFull/index.ts +0 -2
- package/getTransactionFull/types.ts +0 -98
- package/getTransactionFull/withD.ts +0 -57
- package/getTransactionFull/withDA.ts +0 -78
- package/getTransactionFull/withP.ts +0 -69
- package/getTransactionFull/withPD.ts +0 -119
- package/getTransactionFull/withPDA.ts +0 -147
- package/getTransactionFull/withUndefined.ts +0 -39
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/* eslint-disable unicorn/filename-case */
|
|
2
|
-
import type { Config } from '@0xtorch/core'
|
|
3
|
-
import { toLowerHex } from '../types'
|
|
4
|
-
import { getHashesAndInternalTxs } from './getHashesAndInternalTxs'
|
|
5
|
-
import { getTransactionDetails } from './getTransactionDetails'
|
|
6
|
-
import { getTransactionsApps } from './getTransactionsApps'
|
|
7
|
-
import type {
|
|
8
|
-
GetAccountsTransactionFullsCustomParametersDA,
|
|
9
|
-
GetAccountsTransactionFullsCustomReturnType,
|
|
10
|
-
} from './types'
|
|
11
|
-
|
|
12
|
-
export const getAccountsTransactionFullsCustomWithDA = async (
|
|
13
|
-
{
|
|
14
|
-
chain,
|
|
15
|
-
addresses,
|
|
16
|
-
fromBlock,
|
|
17
|
-
toBlock,
|
|
18
|
-
appDataSource,
|
|
19
|
-
decoder,
|
|
20
|
-
analyzer,
|
|
21
|
-
onFetchHashes,
|
|
22
|
-
onFetchTransaction,
|
|
23
|
-
}: GetAccountsTransactionFullsCustomParametersDA,
|
|
24
|
-
config?: Config,
|
|
25
|
-
): Promise<
|
|
26
|
-
GetAccountsTransactionFullsCustomReturnType<GetAccountsTransactionFullsCustomParametersDA>
|
|
27
|
-
> => {
|
|
28
|
-
const timeoutTimestamp =
|
|
29
|
-
Date.now() + (config?.timeout === undefined ? 60_000 : config.timeout)
|
|
30
|
-
|
|
31
|
-
// get transaction hash & internal transaction by explorer
|
|
32
|
-
const { hashes, internalTransactions } = await getHashesAndInternalTxs(
|
|
33
|
-
chain,
|
|
34
|
-
addresses,
|
|
35
|
-
fromBlock,
|
|
36
|
-
toBlock,
|
|
37
|
-
config,
|
|
38
|
-
)
|
|
39
|
-
if (hashes.length === 0) {
|
|
40
|
-
return []
|
|
41
|
-
}
|
|
42
|
-
if (onFetchHashes !== undefined) {
|
|
43
|
-
onFetchHashes(hashes.map((hash) => toLowerHex(hash)))
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// get transaction detail of hashes
|
|
47
|
-
const timeoutForGetTransactionDetail = timeoutTimestamp - Date.now()
|
|
48
|
-
const transactionDetails = await getTransactionDetails(
|
|
49
|
-
chain,
|
|
50
|
-
hashes,
|
|
51
|
-
internalTransactions,
|
|
52
|
-
onFetchTransaction,
|
|
53
|
-
{
|
|
54
|
-
timeout: timeoutForGetTransactionDetail,
|
|
55
|
-
logger: config?.logger,
|
|
56
|
-
},
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
// decode
|
|
60
|
-
const { transactions: transactionsDecoded } = await decoder.decode(
|
|
61
|
-
{
|
|
62
|
-
chain,
|
|
63
|
-
transactions: transactionDetails,
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
timeout: timeoutTimestamp - Date.now(),
|
|
67
|
-
logger: config?.logger,
|
|
68
|
-
},
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
// get apps
|
|
72
|
-
const apps = await getTransactionsApps(appDataSource, transactionDetails, {
|
|
73
|
-
timeout: timeoutTimestamp - Date.now(),
|
|
74
|
-
logger: config?.logger,
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
const transactionsForAnalyzer = transactionsDecoded.map((transaction) => {
|
|
78
|
-
const lowerTo =
|
|
79
|
-
transaction.to === null ? undefined : toLowerHex(transaction.to)
|
|
80
|
-
const app = apps.find(({ address }) => address === lowerTo)?.app
|
|
81
|
-
return {
|
|
82
|
-
...transaction,
|
|
83
|
-
app,
|
|
84
|
-
nativeTokenPrice: undefined,
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
// analyze
|
|
89
|
-
const timeoutForAnalyze = timeoutTimestamp - Date.now()
|
|
90
|
-
const analyzedDatas = await Promise.all(
|
|
91
|
-
transactionsForAnalyzer.map((transactionForAnalyzer) =>
|
|
92
|
-
analyzer.analyze(
|
|
93
|
-
{
|
|
94
|
-
chain,
|
|
95
|
-
transaction: transactionForAnalyzer,
|
|
96
|
-
accountAddresses: addresses,
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
timeout: timeoutForAnalyze,
|
|
100
|
-
logger: config?.logger,
|
|
101
|
-
},
|
|
102
|
-
),
|
|
103
|
-
),
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
return transactionsForAnalyzer.map((transactionForAnalyzer, index) => ({
|
|
107
|
-
...transactionForAnalyzer,
|
|
108
|
-
accountAddresses: addresses,
|
|
109
|
-
actions: analyzedDatas[index].actions,
|
|
110
|
-
accountActions: analyzedDatas[index].accountActions,
|
|
111
|
-
}))
|
|
112
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import type { Config, CryptoCurrencyPrice } from '@0xtorch/core'
|
|
2
|
-
import { toLowerHex } from '../types'
|
|
3
|
-
import { getHashesAndInternalTxs } from './getHashesAndInternalTxs'
|
|
4
|
-
import { getTransactionDetails } from './getTransactionDetails'
|
|
5
|
-
import { getTransactionsApps } from './getTransactionsApps'
|
|
6
|
-
import type {
|
|
7
|
-
GetAccountsTransactionFullsCustomParametersP,
|
|
8
|
-
GetAccountsTransactionFullsCustomReturnType,
|
|
9
|
-
} from './types'
|
|
10
|
-
|
|
11
|
-
export const getAccountsTransactionFullsCustomWithP = async (
|
|
12
|
-
{
|
|
13
|
-
chain,
|
|
14
|
-
addresses,
|
|
15
|
-
fromBlock,
|
|
16
|
-
toBlock,
|
|
17
|
-
appDataSource,
|
|
18
|
-
priceDataSource,
|
|
19
|
-
fiat,
|
|
20
|
-
onFetchHashes,
|
|
21
|
-
onFetchTransaction,
|
|
22
|
-
}: GetAccountsTransactionFullsCustomParametersP,
|
|
23
|
-
config?: Config,
|
|
24
|
-
): Promise<
|
|
25
|
-
GetAccountsTransactionFullsCustomReturnType<GetAccountsTransactionFullsCustomParametersP>
|
|
26
|
-
> => {
|
|
27
|
-
const timeoutTimestamp =
|
|
28
|
-
Date.now() + (config?.timeout === undefined ? 60_000 : config.timeout)
|
|
29
|
-
|
|
30
|
-
// get transaction hash & internal transaction by explorer
|
|
31
|
-
const { hashes, internalTransactions } = await getHashesAndInternalTxs(
|
|
32
|
-
chain,
|
|
33
|
-
addresses,
|
|
34
|
-
fromBlock,
|
|
35
|
-
toBlock,
|
|
36
|
-
config,
|
|
37
|
-
)
|
|
38
|
-
if (hashes.length === 0) {
|
|
39
|
-
return []
|
|
40
|
-
}
|
|
41
|
-
if (onFetchHashes !== undefined) {
|
|
42
|
-
onFetchHashes(hashes.map((hash) => toLowerHex(hash)))
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// get transaction detail of hashes
|
|
46
|
-
const timeoutForGetTransactionDetail = timeoutTimestamp - Date.now()
|
|
47
|
-
const transactionDetails = await getTransactionDetails(
|
|
48
|
-
chain,
|
|
49
|
-
hashes,
|
|
50
|
-
internalTransactions,
|
|
51
|
-
onFetchTransaction,
|
|
52
|
-
{
|
|
53
|
-
timeout: timeoutForGetTransactionDetail,
|
|
54
|
-
logger: config?.logger,
|
|
55
|
-
},
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
// native token price timestamp range
|
|
59
|
-
const minTimestamp = transactionDetails.reduce(
|
|
60
|
-
(minTimestamp, { block }) =>
|
|
61
|
-
Math.min(minTimestamp, Number(block.timestamp)),
|
|
62
|
-
Number.MAX_SAFE_INTEGER,
|
|
63
|
-
)
|
|
64
|
-
const maxTimestamp = transactionDetails.reduce(
|
|
65
|
-
(maxTimestamp, { block }) =>
|
|
66
|
-
Math.max(maxTimestamp, Number(block.timestamp)),
|
|
67
|
-
0,
|
|
68
|
-
)
|
|
69
|
-
const from = minTimestamp * 1000 - 1000 * 60 * 60
|
|
70
|
-
const to = maxTimestamp * 1000 + 1000 * 60 * 60
|
|
71
|
-
|
|
72
|
-
const timeoutForDataSource = timeoutTimestamp - Date.now()
|
|
73
|
-
const [apps, prices] = await Promise.all([
|
|
74
|
-
// get apps
|
|
75
|
-
getTransactionsApps(appDataSource, transactionDetails, {
|
|
76
|
-
timeout: timeoutForDataSource,
|
|
77
|
-
logger: config?.logger,
|
|
78
|
-
}),
|
|
79
|
-
// get native token prices
|
|
80
|
-
priceDataSource.getHistoricalPrices(
|
|
81
|
-
{
|
|
82
|
-
targetCurrencies: [chain.nativeToken.currency],
|
|
83
|
-
vsCurrency: fiat,
|
|
84
|
-
from,
|
|
85
|
-
to,
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
timeout: timeoutForDataSource,
|
|
89
|
-
logger: config?.logger,
|
|
90
|
-
},
|
|
91
|
-
),
|
|
92
|
-
])
|
|
93
|
-
|
|
94
|
-
return transactionDetails.map((transactionDetail) => {
|
|
95
|
-
const lowerTo =
|
|
96
|
-
transactionDetail.to === null
|
|
97
|
-
? undefined
|
|
98
|
-
: toLowerHex(transactionDetail.to)
|
|
99
|
-
const app = apps.find(({ address }) => address === lowerTo)?.app
|
|
100
|
-
const price = prices.reduce(
|
|
101
|
-
(closestPrice: CryptoCurrencyPrice | undefined, price) =>
|
|
102
|
-
closestPrice === undefined ||
|
|
103
|
-
Math.abs(
|
|
104
|
-
price.timestamp - Number(transactionDetail.block.timestamp) * 1000,
|
|
105
|
-
) <
|
|
106
|
-
Math.abs(
|
|
107
|
-
closestPrice.timestamp -
|
|
108
|
-
Number(transactionDetail.block.timestamp) * 1000,
|
|
109
|
-
)
|
|
110
|
-
? price
|
|
111
|
-
: closestPrice,
|
|
112
|
-
undefined,
|
|
113
|
-
)
|
|
114
|
-
return {
|
|
115
|
-
...transactionDetail,
|
|
116
|
-
app,
|
|
117
|
-
nativeTokenPrice: price,
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/* eslint-disable unicorn/filename-case */
|
|
2
|
-
import type { Config, CryptoCurrencyPrice } from '@0xtorch/core'
|
|
3
|
-
import { toLowerHex } from '../types'
|
|
4
|
-
import { getDecodedTransactionsPrices } from './getDecodedTransactionsPrices'
|
|
5
|
-
import { getHashesAndInternalTxs } from './getHashesAndInternalTxs'
|
|
6
|
-
import { getTransactionDetails } from './getTransactionDetails'
|
|
7
|
-
import { getTransactionsApps } from './getTransactionsApps'
|
|
8
|
-
import type {
|
|
9
|
-
GetAccountsTransactionFullsCustomParametersPD,
|
|
10
|
-
GetAccountsTransactionFullsCustomReturnType,
|
|
11
|
-
} from './types'
|
|
12
|
-
|
|
13
|
-
export const getAccountsTransactionFullsCustomWithPD = async (
|
|
14
|
-
{
|
|
15
|
-
chain,
|
|
16
|
-
addresses,
|
|
17
|
-
fromBlock,
|
|
18
|
-
toBlock,
|
|
19
|
-
appDataSource,
|
|
20
|
-
priceDataSource,
|
|
21
|
-
fiat,
|
|
22
|
-
decoder,
|
|
23
|
-
onFetchHashes,
|
|
24
|
-
onFetchTransaction,
|
|
25
|
-
}: GetAccountsTransactionFullsCustomParametersPD,
|
|
26
|
-
config?: Config,
|
|
27
|
-
): Promise<
|
|
28
|
-
GetAccountsTransactionFullsCustomReturnType<GetAccountsTransactionFullsCustomParametersPD>
|
|
29
|
-
> => {
|
|
30
|
-
const timeoutTimestamp =
|
|
31
|
-
Date.now() + (config?.timeout === undefined ? 60_000 : config.timeout)
|
|
32
|
-
|
|
33
|
-
// get transaction hash & internal transaction by explorer
|
|
34
|
-
const { hashes, internalTransactions } = await getHashesAndInternalTxs(
|
|
35
|
-
chain,
|
|
36
|
-
addresses,
|
|
37
|
-
fromBlock,
|
|
38
|
-
toBlock,
|
|
39
|
-
config,
|
|
40
|
-
)
|
|
41
|
-
if (hashes.length === 0) {
|
|
42
|
-
return []
|
|
43
|
-
}
|
|
44
|
-
if (onFetchHashes !== undefined) {
|
|
45
|
-
onFetchHashes(hashes.map((hash) => toLowerHex(hash)))
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// get transaction detail of hashes
|
|
49
|
-
const timeoutForGetTransactionDetail = timeoutTimestamp - Date.now()
|
|
50
|
-
const transactionDetails = await getTransactionDetails(
|
|
51
|
-
chain,
|
|
52
|
-
hashes,
|
|
53
|
-
internalTransactions,
|
|
54
|
-
onFetchTransaction,
|
|
55
|
-
{
|
|
56
|
-
timeout: timeoutForGetTransactionDetail,
|
|
57
|
-
logger: config?.logger,
|
|
58
|
-
},
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
// decode
|
|
62
|
-
const { transactions: transactionsDecoded } = await decoder.decode(
|
|
63
|
-
{
|
|
64
|
-
chain,
|
|
65
|
-
transactions: transactionDetails,
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
timeout: timeoutTimestamp - Date.now(),
|
|
69
|
-
logger: config?.logger,
|
|
70
|
-
},
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
const timeoutForDataSources = timeoutTimestamp - Date.now()
|
|
74
|
-
const [apps, prices] = await Promise.all([
|
|
75
|
-
// get apps
|
|
76
|
-
getTransactionsApps(appDataSource, transactionDetails, {
|
|
77
|
-
timeout: timeoutForDataSources,
|
|
78
|
-
logger: config?.logger,
|
|
79
|
-
}),
|
|
80
|
-
// get prices
|
|
81
|
-
getDecodedTransactionsPrices(
|
|
82
|
-
chain,
|
|
83
|
-
priceDataSource,
|
|
84
|
-
fiat,
|
|
85
|
-
transactionsDecoded,
|
|
86
|
-
{
|
|
87
|
-
timeout: timeoutForDataSources,
|
|
88
|
-
logger: config?.logger,
|
|
89
|
-
},
|
|
90
|
-
),
|
|
91
|
-
])
|
|
92
|
-
|
|
93
|
-
return transactionsDecoded.map((transaction) => {
|
|
94
|
-
const lowerTo =
|
|
95
|
-
transaction.to === null ? undefined : toLowerHex(transaction.to)
|
|
96
|
-
const app = apps.find(({ address }) => address === lowerTo)?.app
|
|
97
|
-
|
|
98
|
-
const timestampMs = Number(transaction.block.timestamp) * 1000
|
|
99
|
-
|
|
100
|
-
const nativeTokenPrice = prices
|
|
101
|
-
.filter(
|
|
102
|
-
({ cryptoCurrencyId }) =>
|
|
103
|
-
cryptoCurrencyId === chain.nativeToken.currency.id,
|
|
104
|
-
)
|
|
105
|
-
.reduce((closestPrice, price) =>
|
|
106
|
-
Math.abs(price.timestamp - timestampMs) <
|
|
107
|
-
Math.abs(closestPrice.timestamp - timestampMs)
|
|
108
|
-
? price
|
|
109
|
-
: closestPrice,
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
...transaction,
|
|
114
|
-
app,
|
|
115
|
-
nativeTokenPrice,
|
|
116
|
-
internalTransactions: transaction.internalTransactions.map(
|
|
117
|
-
(internalTransaction) => ({
|
|
118
|
-
...internalTransaction,
|
|
119
|
-
price: nativeTokenPrice,
|
|
120
|
-
}),
|
|
121
|
-
),
|
|
122
|
-
erc20Transfers: transaction.erc20Transfers.map((transfer) => ({
|
|
123
|
-
...transfer,
|
|
124
|
-
price: prices
|
|
125
|
-
.filter(
|
|
126
|
-
({ cryptoCurrencyId }) =>
|
|
127
|
-
cryptoCurrencyId === transfer.token.currency.id,
|
|
128
|
-
)
|
|
129
|
-
.reduce(
|
|
130
|
-
(closestPrice: CryptoCurrencyPrice | undefined, price) =>
|
|
131
|
-
closestPrice === undefined ||
|
|
132
|
-
Math.abs(price.timestamp - timestampMs) <
|
|
133
|
-
Math.abs(closestPrice.timestamp - timestampMs)
|
|
134
|
-
? price
|
|
135
|
-
: closestPrice,
|
|
136
|
-
undefined,
|
|
137
|
-
),
|
|
138
|
-
})),
|
|
139
|
-
}
|
|
140
|
-
})
|
|
141
|
-
}
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/* eslint-disable unicorn/filename-case */
|
|
2
|
-
import type { Config, CryptoCurrencyPrice } from '@0xtorch/core'
|
|
3
|
-
import { toLowerHex } from '../types'
|
|
4
|
-
import { getDecodedTransactionsPrices } from './getDecodedTransactionsPrices'
|
|
5
|
-
import { getHashesAndInternalTxs } from './getHashesAndInternalTxs'
|
|
6
|
-
import { getTransactionDetails } from './getTransactionDetails'
|
|
7
|
-
import { getTransactionsApps } from './getTransactionsApps'
|
|
8
|
-
import type {
|
|
9
|
-
GetAccountsTransactionFullsCustomParametersPDA,
|
|
10
|
-
GetAccountsTransactionFullsCustomReturnType,
|
|
11
|
-
} from './types'
|
|
12
|
-
|
|
13
|
-
export const getAccountsTransactionFullsCustomWithPDA = async (
|
|
14
|
-
{
|
|
15
|
-
chain,
|
|
16
|
-
addresses,
|
|
17
|
-
fromBlock,
|
|
18
|
-
toBlock,
|
|
19
|
-
appDataSource,
|
|
20
|
-
priceDataSource,
|
|
21
|
-
fiat,
|
|
22
|
-
decoder,
|
|
23
|
-
analyzer,
|
|
24
|
-
onFetchHashes,
|
|
25
|
-
onFetchTransaction,
|
|
26
|
-
}: GetAccountsTransactionFullsCustomParametersPDA,
|
|
27
|
-
config?: Config,
|
|
28
|
-
): Promise<
|
|
29
|
-
GetAccountsTransactionFullsCustomReturnType<GetAccountsTransactionFullsCustomParametersPDA>
|
|
30
|
-
> => {
|
|
31
|
-
const timeoutTimestamp =
|
|
32
|
-
Date.now() + (config?.timeout === undefined ? 60_000 : config.timeout)
|
|
33
|
-
|
|
34
|
-
// get transaction hash & internal transaction by explorer
|
|
35
|
-
const { hashes, internalTransactions } = await getHashesAndInternalTxs(
|
|
36
|
-
chain,
|
|
37
|
-
addresses,
|
|
38
|
-
fromBlock,
|
|
39
|
-
toBlock,
|
|
40
|
-
config,
|
|
41
|
-
)
|
|
42
|
-
if (hashes.length === 0) {
|
|
43
|
-
return []
|
|
44
|
-
}
|
|
45
|
-
if (onFetchHashes !== undefined) {
|
|
46
|
-
onFetchHashes(hashes.map((hash) => toLowerHex(hash)))
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// get transaction detail of hashes
|
|
50
|
-
const timeoutForGetTransactionDetail = timeoutTimestamp - Date.now()
|
|
51
|
-
const transactionDetails = await getTransactionDetails(
|
|
52
|
-
chain,
|
|
53
|
-
hashes,
|
|
54
|
-
internalTransactions,
|
|
55
|
-
onFetchTransaction,
|
|
56
|
-
{
|
|
57
|
-
timeout: timeoutForGetTransactionDetail,
|
|
58
|
-
logger: config?.logger,
|
|
59
|
-
},
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
// decode
|
|
63
|
-
const { transactions: transactionsDecoded } = await decoder.decode(
|
|
64
|
-
{
|
|
65
|
-
chain,
|
|
66
|
-
transactions: transactionDetails,
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
timeout: timeoutTimestamp - Date.now(),
|
|
70
|
-
logger: config?.logger,
|
|
71
|
-
},
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
const timeoutForDataSources = timeoutTimestamp - Date.now()
|
|
75
|
-
const [apps, prices] = await Promise.all([
|
|
76
|
-
// get apps
|
|
77
|
-
getTransactionsApps(appDataSource, transactionDetails, {
|
|
78
|
-
timeout: timeoutForDataSources,
|
|
79
|
-
logger: config?.logger,
|
|
80
|
-
}),
|
|
81
|
-
// get prices
|
|
82
|
-
getDecodedTransactionsPrices(
|
|
83
|
-
chain,
|
|
84
|
-
priceDataSource,
|
|
85
|
-
fiat,
|
|
86
|
-
transactionsDecoded,
|
|
87
|
-
{
|
|
88
|
-
timeout: timeoutForDataSources,
|
|
89
|
-
logger: config?.logger,
|
|
90
|
-
},
|
|
91
|
-
),
|
|
92
|
-
])
|
|
93
|
-
|
|
94
|
-
const transactionsForAnalyzer = transactionsDecoded.map((transaction) => {
|
|
95
|
-
const lowerTo =
|
|
96
|
-
transaction.to === null ? undefined : toLowerHex(transaction.to)
|
|
97
|
-
const app = apps.find(({ address }) => address === lowerTo)?.app
|
|
98
|
-
const timestampMs = Number(transaction.block.timestamp) * 1000
|
|
99
|
-
const nativeTokenPrice = prices
|
|
100
|
-
.filter(
|
|
101
|
-
({ cryptoCurrencyId }) =>
|
|
102
|
-
cryptoCurrencyId === chain.nativeToken.currency.id,
|
|
103
|
-
)
|
|
104
|
-
.reduce(
|
|
105
|
-
(closestPrice: CryptoCurrencyPrice | undefined, price) =>
|
|
106
|
-
closestPrice === undefined ||
|
|
107
|
-
Math.abs(price.timestamp - timestampMs) <
|
|
108
|
-
Math.abs(closestPrice.timestamp - timestampMs)
|
|
109
|
-
? price
|
|
110
|
-
: closestPrice,
|
|
111
|
-
undefined,
|
|
112
|
-
)
|
|
113
|
-
return {
|
|
114
|
-
...transaction,
|
|
115
|
-
app,
|
|
116
|
-
nativeTokenPrice,
|
|
117
|
-
internalTransactions: transaction.internalTransactions.map(
|
|
118
|
-
(internalTransaction) => ({
|
|
119
|
-
...internalTransaction,
|
|
120
|
-
price: nativeTokenPrice,
|
|
121
|
-
}),
|
|
122
|
-
),
|
|
123
|
-
erc20Transfers: transaction.erc20Transfers.map((transfer) => ({
|
|
124
|
-
...transfer,
|
|
125
|
-
price: prices
|
|
126
|
-
.filter(
|
|
127
|
-
({ cryptoCurrencyId }) =>
|
|
128
|
-
cryptoCurrencyId === transfer.token.currency.id,
|
|
129
|
-
)
|
|
130
|
-
.reduce(
|
|
131
|
-
(closestPrice: CryptoCurrencyPrice | undefined, price) =>
|
|
132
|
-
closestPrice === undefined ||
|
|
133
|
-
Math.abs(price.timestamp - timestampMs) <
|
|
134
|
-
Math.abs(closestPrice.timestamp - timestampMs)
|
|
135
|
-
? price
|
|
136
|
-
: closestPrice,
|
|
137
|
-
undefined,
|
|
138
|
-
),
|
|
139
|
-
})),
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
// analyze
|
|
144
|
-
const timeoutForAnalyzer = timeoutTimestamp - Date.now()
|
|
145
|
-
const analyzedDatas = await Promise.all(
|
|
146
|
-
transactionsForAnalyzer.map((transactionForAnalyzer) =>
|
|
147
|
-
analyzer.analyze(
|
|
148
|
-
{
|
|
149
|
-
chain,
|
|
150
|
-
transaction: transactionForAnalyzer,
|
|
151
|
-
accountAddresses: addresses,
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
timeout: timeoutForAnalyzer,
|
|
155
|
-
logger: config?.logger,
|
|
156
|
-
},
|
|
157
|
-
),
|
|
158
|
-
),
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
return transactionsForAnalyzer.map((transactionForAnalyzer, index) => ({
|
|
162
|
-
...transactionForAnalyzer,
|
|
163
|
-
accountAddresses: addresses,
|
|
164
|
-
actions: analyzedDatas[index].actions,
|
|
165
|
-
accountActions: analyzedDatas[index].accountActions,
|
|
166
|
-
}))
|
|
167
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type { Config } from '@0xtorch/core'
|
|
2
|
-
import type { LowerHex } from '../types'
|
|
3
|
-
import { toLowerHex } from '../types'
|
|
4
|
-
import { getHashesAndInternalTxs } from './getHashesAndInternalTxs'
|
|
5
|
-
import { getTransactionDetails } from './getTransactionDetails'
|
|
6
|
-
import type {
|
|
7
|
-
GetAccountsTransactionFullsCustomParametersAllUndefined,
|
|
8
|
-
GetAccountsTransactionFullsCustomReturnType,
|
|
9
|
-
} from './types'
|
|
10
|
-
|
|
11
|
-
export const getAccountsTransactionFullsCustomWithAllUndefined = async (
|
|
12
|
-
{
|
|
13
|
-
chain,
|
|
14
|
-
addresses,
|
|
15
|
-
fromBlock,
|
|
16
|
-
toBlock,
|
|
17
|
-
appDataSource,
|
|
18
|
-
onFetchHashes,
|
|
19
|
-
onFetchTransaction,
|
|
20
|
-
}: GetAccountsTransactionFullsCustomParametersAllUndefined,
|
|
21
|
-
config?: Config,
|
|
22
|
-
): Promise<
|
|
23
|
-
GetAccountsTransactionFullsCustomReturnType<GetAccountsTransactionFullsCustomParametersAllUndefined>
|
|
24
|
-
> => {
|
|
25
|
-
const timeoutTimestamp =
|
|
26
|
-
Date.now() + (config?.timeout === undefined ? 60_000 : config.timeout)
|
|
27
|
-
|
|
28
|
-
// get transaction hash & internal transaction by explorer
|
|
29
|
-
const { hashes, internalTransactions } = await getHashesAndInternalTxs(
|
|
30
|
-
chain,
|
|
31
|
-
addresses,
|
|
32
|
-
fromBlock,
|
|
33
|
-
toBlock,
|
|
34
|
-
config,
|
|
35
|
-
)
|
|
36
|
-
if (hashes.length === 0) {
|
|
37
|
-
return []
|
|
38
|
-
}
|
|
39
|
-
if (onFetchHashes !== undefined) {
|
|
40
|
-
onFetchHashes(hashes.map((hash) => toLowerHex(hash)))
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// get transaction detail of hashes
|
|
44
|
-
const timeoutForGetTransactionDetail = timeoutTimestamp - Date.now()
|
|
45
|
-
const transactionDetails = await getTransactionDetails(
|
|
46
|
-
chain,
|
|
47
|
-
hashes,
|
|
48
|
-
internalTransactions,
|
|
49
|
-
onFetchTransaction,
|
|
50
|
-
{
|
|
51
|
-
timeout: timeoutForGetTransactionDetail,
|
|
52
|
-
logger: config?.logger,
|
|
53
|
-
},
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
// get app of to address
|
|
57
|
-
const toAddresses = [
|
|
58
|
-
...new Set(
|
|
59
|
-
transactionDetails
|
|
60
|
-
.map(({ to }) => (to === null ? undefined : toLowerHex(to)))
|
|
61
|
-
.filter((toAddress): toAddress is LowerHex => toAddress !== undefined),
|
|
62
|
-
),
|
|
63
|
-
]
|
|
64
|
-
const timeoutForGetApps = timeoutTimestamp - Date.now()
|
|
65
|
-
const apps = await Promise.all(
|
|
66
|
-
toAddresses.map((toAddress) =>
|
|
67
|
-
appDataSource === undefined
|
|
68
|
-
? undefined
|
|
69
|
-
: appDataSource.getApp(chain.id, toAddress, {
|
|
70
|
-
timeout: timeoutForGetApps,
|
|
71
|
-
logger: config?.logger,
|
|
72
|
-
}),
|
|
73
|
-
),
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
return transactionDetails.map((transactionDetail) => {
|
|
77
|
-
const appIndex =
|
|
78
|
-
transactionDetail.to === null
|
|
79
|
-
? -1
|
|
80
|
-
: toAddresses.indexOf(toLowerHex(transactionDetail.to))
|
|
81
|
-
const app = appIndex < 0 ? undefined : apps[appIndex]
|
|
82
|
-
return {
|
|
83
|
-
...transactionDetail,
|
|
84
|
-
app,
|
|
85
|
-
nativeTokenPrice: undefined,
|
|
86
|
-
}
|
|
87
|
-
})
|
|
88
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { Config, FiatCurrency } from '@0xtorch/core'
|
|
2
|
-
import { coingeckoCryptoCurrencyDataSource, usd } from '@0xtorch/core'
|
|
3
|
-
import { analyzer } from '../analyzer'
|
|
4
|
-
import type { Chain } from '../chains'
|
|
5
|
-
import { decoder } from '../decoder'
|
|
6
|
-
import type { Hex } from '../types'
|
|
7
|
-
import { getTransactionFullCustom } from './getTransactionFullCustom'
|
|
8
|
-
|
|
9
|
-
type GetTransactionFullParameters = {
|
|
10
|
-
readonly chain: Chain
|
|
11
|
-
readonly hash: Hex
|
|
12
|
-
readonly fiat?: FiatCurrency
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const getTransactionFull = async (
|
|
16
|
-
{ chain, hash, fiat = usd }: GetTransactionFullParameters,
|
|
17
|
-
config?: Config,
|
|
18
|
-
) =>
|
|
19
|
-
await getTransactionFullCustom(
|
|
20
|
-
{
|
|
21
|
-
chain,
|
|
22
|
-
hash,
|
|
23
|
-
appDataSource: undefined,
|
|
24
|
-
priceDataSource: coingeckoCryptoCurrencyDataSource,
|
|
25
|
-
fiat,
|
|
26
|
-
decoder,
|
|
27
|
-
analyzer,
|
|
28
|
-
},
|
|
29
|
-
config,
|
|
30
|
-
)
|