@exodus/bitcoin-api 2.21.4 → 2.22.1
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/CHANGELOG.md +19 -0
- package/package.json +3 -3
- package/src/account-state.js +1 -10
- package/src/tx-log/index.js +0 -1
- package/src/tx-send/batch-tx.js +8 -11
- package/src/tx-log/bitcoin-me-monitor.js +0 -78
- package/src/tx-log/magic-eden-bitcoin-monitor.js +0 -86
- package/src/tx-log/me-flagr.js +0 -22
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [2.22.1](https://github.com/ExodusMovement/assets/compare/@exodus/bitcoin-api@2.22.0...@exodus/bitcoin-api@2.22.1) (2024-08-18)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* pass allowUnconfirmed option through in batch-tx ([#3177](https://github.com/ExodusMovement/assets/issues/3177)) ([d8e073b](https://github.com/ExodusMovement/assets/commit/d8e073b4c66c79dae5808877f5c4d4cc98d93444))
|
|
12
|
+
* update exodus/timer ([#3134](https://github.com/ExodusMovement/assets/issues/3134)) ([e977be5](https://github.com/ExodusMovement/assets/commit/e977be5280c214c1b814409d9461ce6628bb19be))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## [2.22.0](https://github.com/ExodusMovement/assets/compare/@exodus/bitcoin-api@2.21.4...@exodus/bitcoin-api@2.22.0) (2024-08-08)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* move ME BTC monitor to the ME codebase ([#3118](https://github.com/ExodusMovement/assets/issues/3118)) ([2610e96](https://github.com/ExodusMovement/assets/commit/2610e966f5d078e6b9d87a08c4d86ad090400583))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
## [2.21.4](https://github.com/ExodusMovement/assets/compare/@exodus/bitcoin-api@2.21.3...@exodus/bitcoin-api@2.21.4) (2024-08-05)
|
|
7
26
|
|
|
8
27
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exodus/bitcoin-api",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.22.1",
|
|
4
4
|
"description": "Exodus bitcoin-api",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"files": [
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@exodus/key-identifier": "^1.1.1",
|
|
31
31
|
"@exodus/models": "^11.0.0",
|
|
32
32
|
"@exodus/simple-retry": "^0.0.6",
|
|
33
|
-
"@exodus/timer": "^1.
|
|
33
|
+
"@exodus/timer": "^1.1.1",
|
|
34
34
|
"bech32": "^1.1.3",
|
|
35
35
|
"bip32-path": "^0.4.2",
|
|
36
36
|
"bn.js": "^4.12.0",
|
|
@@ -66,5 +66,5 @@
|
|
|
66
66
|
"type": "git",
|
|
67
67
|
"url": "git+https://github.com/ExodusMovement/assets.git"
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "ceb41116fe6afaa75965a0ce9920e379097f2553"
|
|
70
70
|
}
|
package/src/account-state.js
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import { AccountState, UtxoCollection } from '@exodus/models'
|
|
2
2
|
|
|
3
|
-
export function createAccountState({
|
|
4
|
-
asset,
|
|
5
|
-
ordinalsEnabled = false,
|
|
6
|
-
brc20Enabled = false,
|
|
7
|
-
isMagicEdenFungibleBalancesEnabled = false,
|
|
8
|
-
}) {
|
|
3
|
+
export function createAccountState({ asset, ordinalsEnabled = false, brc20Enabled = false }) {
|
|
9
4
|
const empty = UtxoCollection.createEmpty({
|
|
10
5
|
currency: asset.currency,
|
|
11
6
|
})
|
|
@@ -27,10 +22,6 @@ export function createAccountState({
|
|
|
27
22
|
defaults.brc20Balances = {}
|
|
28
23
|
}
|
|
29
24
|
|
|
30
|
-
if (isMagicEdenFungibleBalancesEnabled) {
|
|
31
|
-
defaults.magicEdenApiFungibleBalances = []
|
|
32
|
-
}
|
|
33
|
-
|
|
34
25
|
return class BitcoinAccountState extends AccountState {
|
|
35
26
|
static defaults = defaults
|
|
36
27
|
}
|
package/src/tx-log/index.js
CHANGED
package/src/tx-send/batch-tx.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
1
|
+
// eslint-disable-next-line @exodus/import/no-extraneous-dependencies
|
|
2
2
|
import BIP32 from '@exodus/bip32'
|
|
3
3
|
import { Psbt } from '@exodus/bitcoinjs-lib'
|
|
4
4
|
import BipPath from 'bip32-path'
|
|
@@ -19,13 +19,12 @@ export const getCreateBatchTransaction = ({
|
|
|
19
19
|
getFeeEstimator,
|
|
20
20
|
assetClientInterface,
|
|
21
21
|
changeAddressType,
|
|
22
|
+
allowUnconfirmedRbfEnabledUtxos,
|
|
22
23
|
}) => {
|
|
23
24
|
assert(assetClientInterface, `assetClientInterface must be supplied in sendTx`)
|
|
24
25
|
|
|
25
|
-
return async ({
|
|
26
|
-
const
|
|
27
|
-
const asset = stuff[assetName]
|
|
28
|
-
|
|
26
|
+
return async ({ asset, walletAccount, recipients, options = {} }) => {
|
|
27
|
+
const assetName = asset.name
|
|
29
28
|
const {
|
|
30
29
|
feeData = await assetClientInterface.getFeeConfig({ assetName }),
|
|
31
30
|
taprootInputWitnessSize,
|
|
@@ -57,7 +56,7 @@ export const getCreateBatchTransaction = ({
|
|
|
57
56
|
unconfirmedTxAncestor,
|
|
58
57
|
taprootInputWitnessSize,
|
|
59
58
|
changeAddressType,
|
|
60
|
-
allowUnconfirmedRbfEnabledUtxos
|
|
59
|
+
allowUnconfirmedRbfEnabledUtxos,
|
|
61
60
|
})
|
|
62
61
|
|
|
63
62
|
if (!selectedUtxos) throw new Error('Not enough funds.')
|
|
@@ -76,12 +75,10 @@ export const getCreateBatchTransaction = ({
|
|
|
76
75
|
const addressOpts = {
|
|
77
76
|
walletAccount,
|
|
78
77
|
assetName,
|
|
79
|
-
chainIndex
|
|
80
|
-
addressIndex
|
|
78
|
+
chainIndex,
|
|
79
|
+
addressIndex,
|
|
80
|
+
purpose: utxo.address.meta.purpose ?? 86,
|
|
81
81
|
}
|
|
82
|
-
addressOpts.chainIndex = chainIndex
|
|
83
|
-
addressOpts.addressIndex = addressIndex
|
|
84
|
-
addressOpts.purpose = utxo.address.meta.purpose
|
|
85
82
|
|
|
86
83
|
const [address, xpub] = await Promise.all([
|
|
87
84
|
assetClientInterface.getAddress(addressOpts),
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Monitor as BitcoinMonitor } from './bitcoin-monitor'
|
|
2
|
-
import fetchFlagrEvaluation from './me-flagr'
|
|
3
|
-
|
|
4
|
-
const FLAGR_KEY = 'bitcoin-balance-api'
|
|
5
|
-
|
|
6
|
-
export class MagicEdenBitcoinMonitor extends BitcoinMonitor {
|
|
7
|
-
constructor(args) {
|
|
8
|
-
super(args)
|
|
9
|
-
this.useMagicEdenMonitor = false
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async setServer(assetConfig = {}) {
|
|
13
|
-
super.setServer(assetConfig)
|
|
14
|
-
|
|
15
|
-
const walletAccounts = await this.aci.getWalletAccounts({ assetName: this.asset.name })
|
|
16
|
-
const address = await this.aci.getReceiveAddress({
|
|
17
|
-
assetName: this.asset.name,
|
|
18
|
-
walletAccount: walletAccounts[0],
|
|
19
|
-
useCache: true,
|
|
20
|
-
})
|
|
21
|
-
await this.initFlagr(address)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async initFlagr(address) {
|
|
25
|
-
if (this.useMagicEdenMonitor) return
|
|
26
|
-
try {
|
|
27
|
-
const response = await fetchFlagrEvaluation(address, FLAGR_KEY)
|
|
28
|
-
if (response.variantKey === 'on') {
|
|
29
|
-
this.useMagicEdenMonitor = true
|
|
30
|
-
}
|
|
31
|
-
} catch (error) {
|
|
32
|
-
console.error('Failed to fetch useMagicEdenMonitor config:', error)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async fetchFungibleBalances(walletAccount) {
|
|
37
|
-
if (!this.useMagicEdenMonitor) return
|
|
38
|
-
|
|
39
|
-
const purposes = await this.aci.getSupportedPurposes({
|
|
40
|
-
assetName: this.asset.name,
|
|
41
|
-
walletAccount,
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
const addresses = await Promise.all(
|
|
45
|
-
purposes.map((purpose) =>
|
|
46
|
-
this.aci.getReceiveAddress({
|
|
47
|
-
assetName: this.asset.name,
|
|
48
|
-
walletAccount,
|
|
49
|
-
useCache: true,
|
|
50
|
-
purpose,
|
|
51
|
-
})
|
|
52
|
-
)
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
const response = await fetch('https://api-mainnet.magiceden.io/v1/wallet/balances/fungible', {
|
|
56
|
-
method: 'POST',
|
|
57
|
-
headers: {
|
|
58
|
-
Accept: 'application/json',
|
|
59
|
-
'Content-Type': 'application/json',
|
|
60
|
-
},
|
|
61
|
-
body: JSON.stringify(
|
|
62
|
-
addresses.map((address) => ({ address, chain: this.asset.baseAssetName }))
|
|
63
|
-
),
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
throw new Error(
|
|
68
|
-
`Unable to fetch bitcoin fungible balanes: API returned ${response.status}: ${response.statusText || 'Unknown Status Text'}`
|
|
69
|
-
)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const { balances } = await response.json()
|
|
73
|
-
|
|
74
|
-
return balances
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export const createMagicEdenBitcoinMonitor = (args) => new MagicEdenBitcoinMonitor(args)
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { Monitor as BitcoinMonitor } from './bitcoin-monitor'
|
|
2
|
-
import fetchFlagrEvaluation from './me-flagr'
|
|
3
|
-
|
|
4
|
-
const FLAGR_KEY = 'bitcoin-balance-api'
|
|
5
|
-
|
|
6
|
-
export class MagicEdenBitcoinMonitor extends BitcoinMonitor {
|
|
7
|
-
constructor(args) {
|
|
8
|
-
super(args)
|
|
9
|
-
this.useMagicEdenMonitor = false
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async setServer(assetConfig = {}) {
|
|
13
|
-
super.setServer(assetConfig)
|
|
14
|
-
|
|
15
|
-
const walletAccounts = await this.aci.getWalletAccounts({ assetName: this.asset.name })
|
|
16
|
-
const address = await this.aci.getReceiveAddress({
|
|
17
|
-
assetName: this.asset.name,
|
|
18
|
-
walletAccount: walletAccounts[0],
|
|
19
|
-
useCache: true,
|
|
20
|
-
})
|
|
21
|
-
await this.initFlagr(address)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async initFlagr(address) {
|
|
25
|
-
if (this.useMagicEdenMonitor) return
|
|
26
|
-
try {
|
|
27
|
-
const response = await fetchFlagrEvaluation(address, FLAGR_KEY)
|
|
28
|
-
if (response.variantKey === 'on') {
|
|
29
|
-
this.useMagicEdenMonitor = true
|
|
30
|
-
}
|
|
31
|
-
} catch (error) {
|
|
32
|
-
console.error('Failed to fetch useMagicEdenMonitor config:', error)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async fetchFungibleBalances(walletAccount) {
|
|
37
|
-
if (!this.useMagicEdenMonitor) return
|
|
38
|
-
|
|
39
|
-
const purposes = await this.aci.getSupportedPurposes({
|
|
40
|
-
assetName: this.asset.name,
|
|
41
|
-
walletAccount,
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
const addresses = await Promise.all(
|
|
45
|
-
purposes.map((purpose) =>
|
|
46
|
-
this.aci.getReceiveAddress({
|
|
47
|
-
assetName: this.asset.name,
|
|
48
|
-
walletAccount,
|
|
49
|
-
useCache: true,
|
|
50
|
-
purpose,
|
|
51
|
-
})
|
|
52
|
-
)
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
const response = await fetch('https://api-mainnet.magiceden.io/v1/wallet/balances/fungible', {
|
|
56
|
-
method: 'POST',
|
|
57
|
-
headers: {
|
|
58
|
-
Accept: 'application/json',
|
|
59
|
-
'Content-Type': 'application/json',
|
|
60
|
-
},
|
|
61
|
-
body: JSON.stringify(
|
|
62
|
-
addresses.map((address) => ({ address, chain: this.asset.baseAssetName }))
|
|
63
|
-
),
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
throw new Error(
|
|
68
|
-
`Unable to fetch bitcoin fungible balanes: API returned ${response.status}: ${response.statusText || 'Unknown Status Text'}`
|
|
69
|
-
)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const { balances } = await response.json()
|
|
73
|
-
|
|
74
|
-
const metadata = new Map()
|
|
75
|
-
balances.forEach((balance) => {
|
|
76
|
-
if (balance.asset?.id && balance.image) {
|
|
77
|
-
metadata.set(balance.asset.id, { imageURL: balance.image })
|
|
78
|
-
}
|
|
79
|
-
})
|
|
80
|
-
this.emit('token-metadata', { source: 'bitcoin', metadata })
|
|
81
|
-
|
|
82
|
-
return balances
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export const createMagicEdenBitcoinMonitor = (args) => new MagicEdenBitcoinMonitor(args)
|
package/src/tx-log/me-flagr.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
const FLAGR_URL = 'https://flagr-w.magiceden.io/api/v1/evaluation'
|
|
2
|
-
|
|
3
|
-
const fetchFlagrEvaluation = async (wallet, flagKey) => {
|
|
4
|
-
const response = await fetch(FLAGR_URL, {
|
|
5
|
-
method: 'POST',
|
|
6
|
-
headers: {
|
|
7
|
-
Accept: 'application/json',
|
|
8
|
-
'Content-Type': 'application/json',
|
|
9
|
-
},
|
|
10
|
-
body: JSON.stringify({ entityContext: { wallet }, flagKey }),
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
if (!response.ok) {
|
|
14
|
-
throw new Error(
|
|
15
|
-
`${FLAGR_URL} returned ${response.status}: ${response.statusText || 'Unknown Status Text'}`
|
|
16
|
-
)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return response.json()
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export default fetchFlagrEvaluation
|