diff --git a/packages/bitcoin-dlc-provider/lib/BitcoinDlcProvider.ts b/packages/bitcoin-dlc-provider/lib/BitcoinDlcProvider.ts index a00eddc4..83714f76 100644 --- a/packages/bitcoin-dlc-provider/lib/BitcoinDlcProvider.ts +++ b/packages/bitcoin-dlc-provider/lib/BitcoinDlcProvider.ts @@ -1142,30 +1142,52 @@ Payout Group not found', let index = 0; let groupIndex = -1; let groupLength = 0; + const payoutGroupFound = false; - for (const payoutGroup of payoutGroups) { + for (const [i, payoutGroup] of payoutGroups.entries()) { if (payoutGroup.payout === roundedPayout) { groupIndex = payoutGroup.groups.findIndex((group) => { return group.every((msg, i) => msg === outcomesFormatted[i]); }); - if (groupIndex === -1) - throw Error( - 'Failed to Find OutcomeIndex From HyperbolaPayoutCurvePiece. \ -Payout Group found but incorrect group index', - ); - index += groupIndex; - groupLength = payoutGroup.groups[groupIndex].length; - break; + if (groupIndex !== -1) { + index += groupIndex; + groupLength = payoutGroup.groups[groupIndex].length; + break; + } + } else if (payoutGroup.payout === BigInt(payout.toString())) { + // Edge case to account for case where payout is maximum payout for DLC + // But rounded payout does not round down + if (payoutGroups[i - 1].payout === roundedPayout) { + // Ensure that the previous payout group causes index to be incremented + index += payoutGroups[i - 1].groups.length; + } + + groupIndex = payoutGroup.groups.findIndex((group) => { + return group.every((msg, i) => msg === outcomesFormatted[i]); + }); + if (groupIndex !== -1) { + index += groupIndex; + groupLength = payoutGroup.groups[groupIndex].length; + break; + } } else { index += payoutGroup.groups.length; } } - if (groupIndex === -1) - throw Error( - 'Failed to Find OutcomeIndex From HyperbolaPayoutCurvePiece. \ -Payout Group not found', - ); + if (groupIndex === -1) { + if (payoutGroupFound) { + throw Error( + 'Failed to Find OutcomeIndex From HyperbolaPayoutCurvePiece. \ +Payout Group found but incorrect group index', + ); + } else { + throw Error( + 'Failed to Find OutcomeIndex From HyperbolaPayoutCurvePiece. \ + Payout Group not found', + ); + } + } return { index: payoutIndexOffset + index, groupLength }; } diff --git a/tests/integration/dlc/dlc.test.ts b/tests/integration/dlc/dlc.test.ts index 95248ba0..08354d01 100644 --- a/tests/integration/dlc/dlc.test.ts +++ b/tests/integration/dlc/dlc.test.ts @@ -1,5 +1,6 @@ import 'mocha'; +import { Value } from '@node-dlc/bitcoin'; import { CoveredCall, DlcTxBuilder, @@ -43,7 +44,9 @@ import { chains, getInput } from '../common'; import f from '../fixtures/blockchain.json'; import Oracle from '../models/Oracle'; import { + calculateNetworkFees, generateContractInfo, + generateLongCallOffer, generateOracleAttestation, } from '../utils/contract'; @@ -55,7 +58,6 @@ const alice = chain.client; const bob = chains.bitcoinWithJs2.client; const carol = chains.bitcoinWithJs3.client; -const mm = chains.bitcoinWithJs4.client; describe('bitcoin networks', () => { it('have correct genesis block hashes', async () => { @@ -595,6 +597,274 @@ describe('dlc provider', () => { }); }); + // Test to make sure payout groups find index works properly + describe('Finding payout index works for long calls', () => { + it('finds payout index correctly for payout that does not match rounded payout', async () => { + console.time('offer-get-time'); + const aliceInput = await getInput(alice); + const bobInput = await getInput(bob); + + oracle = new Oracle('olivia', 18); + + const feePerByte = 5; + + const LONG_OPTION_MAX_GAIN = Value.fromBitcoin(0.005); + + const contractPrice = 0.0108; + + const networkFees = Value.fromSats( + calculateNetworkFees(BigInt(feePerByte)), + ); + + const contractSize = 0.1; + + console.log('networkFees.bitcoin', networkFees.bitcoin); + + const maxGain = Value.fromBitcoin( + LONG_OPTION_MAX_GAIN.bitcoin * contractSize + + contractPrice * contractSize + + networkFees.bitcoin, + ); + const premium = Value.fromBitcoin( + contractPrice * contractSize + networkFees.bitcoin, + ); + + const offer = generateLongCallOffer( + oracle, + 18, + 2, + 'atomic-deribit-BTC-13OCT23', + 29000, + maxGain, + premium, + feePerByte, + 5000, + 'bitcoin_regtest', + ); + + const cetLocktime = 1617170572; + const refundLocktime = 1617170573; + + dlcOffer = await alice.dlc.createDlcOffer( + offer.contractInfo, + offer.offerCollateralSatoshis, + offer.feeRatePerVb, + cetLocktime, + refundLocktime, + [aliceInput], + ); + + console.timeEnd('offer-get-time'); + + console.time('accept-time'); + const acceptDlcOfferResponse: AcceptDlcOfferResponse = await bob.dlc.acceptDlcOffer( + dlcOffer, + [bobInput], + ); + dlcAccept = acceptDlcOfferResponse.dlcAccept; + dlcTransactions = acceptDlcOfferResponse.dlcTransactions; + + const { dlcTransactions: dlcTxsFromMsgs } = await bob.dlc.createDlcTxs( + dlcOffer, + dlcAccept, + ); + + expect( + (dlcTransactions as DlcTransactionsV0).fundTx + .serialize() + .toString('hex'), + ).to.equal( + (dlcTxsFromMsgs as DlcTransactionsV0).fundTx + .serialize() + .toString('hex'), + ); + expect( + (dlcTransactions as DlcTransactionsV0).cets[5] + .serialize() + .toString('hex'), + ).to.equal( + (dlcTxsFromMsgs as DlcTransactionsV0).cets[5] + .serialize() + .toString('hex'), + ); + + console.timeEnd('accept-time'); + + console.time('sign-time'); + const signDlcAcceptResponse: SignDlcAcceptResponse = await alice.dlc.signDlcAccept( + dlcOffer, + dlcAccept, + ); + dlcSign = signDlcAcceptResponse.dlcSign; + console.timeEnd('sign-time'); + + const fundTx = await bob.dlc.finalizeDlcSign( + dlcOffer, + dlcAccept, + dlcSign, + dlcTransactions, + ); + const fundTxId = await bob.chain.sendRawTransaction( + fundTx.serialize().toString('hex'), + ); + + const outcome = 37000; + oracleAttestation = generateOracleAttestation( + outcome, + oracle, + oracleBase, + 18, + 'atomic-deribit-BTC-13OCT23', + ); + + const cet = await bob.dlc.execute( + dlcOffer, + dlcAccept, + dlcSign, + dlcTransactions, + oracleAttestation, + false, + ); + const cetTxId = await bob.chain.sendRawTransaction( + cet.serialize().toString('hex'), + ); + const cetTx = await alice.getMethod('getTransactionByHash')(cetTxId); + expect(cetTx._raw.vin.length).to.equal(1); + }); + + it('finds payout index correctly for payout that does match rounded payout', async () => { + console.time('offer-get-time'); + const aliceInput = await getInput(alice); + const bobInput = await getInput(bob); + + oracle = new Oracle('olivia', 18); + + const feePerByte = 5; + + const LONG_OPTION_MAX_GAIN = Value.fromBitcoin(0.005); + + const contractPrice = 0.0108; + + const networkFees = Value.fromSats( + calculateNetworkFees(BigInt(feePerByte)), + ); + + const contractSize = 0.1; + + console.log('networkFees.bitcoin', networkFees.bitcoin); + + const maxGain = Value.fromBitcoin( + LONG_OPTION_MAX_GAIN.bitcoin * contractSize + + contractPrice * contractSize, + ); + const premium = Value.fromBitcoin( + contractPrice * contractSize + networkFees.bitcoin, + ); + + const offer = generateLongCallOffer( + oracle, + 18, + 2, + 'atomic-deribit-BTC-13OCT23', + 29000, + maxGain, + premium, + feePerByte, + 5000, + 'bitcoin_regtest', + ); + + const cetLocktime = 1617170572; + const refundLocktime = 1617170573; + + dlcOffer = await alice.dlc.createDlcOffer( + offer.contractInfo, + offer.offerCollateralSatoshis, + offer.feeRatePerVb, + cetLocktime, + refundLocktime, + [aliceInput], + ); + + console.timeEnd('offer-get-time'); + + console.time('accept-time'); + const acceptDlcOfferResponse: AcceptDlcOfferResponse = await bob.dlc.acceptDlcOffer( + dlcOffer, + [bobInput], + ); + dlcAccept = acceptDlcOfferResponse.dlcAccept; + dlcTransactions = acceptDlcOfferResponse.dlcTransactions; + + const { dlcTransactions: dlcTxsFromMsgs } = await bob.dlc.createDlcTxs( + dlcOffer, + dlcAccept, + ); + + expect( + (dlcTransactions as DlcTransactionsV0).fundTx + .serialize() + .toString('hex'), + ).to.equal( + (dlcTxsFromMsgs as DlcTransactionsV0).fundTx + .serialize() + .toString('hex'), + ); + expect( + (dlcTransactions as DlcTransactionsV0).cets[5] + .serialize() + .toString('hex'), + ).to.equal( + (dlcTxsFromMsgs as DlcTransactionsV0).cets[5] + .serialize() + .toString('hex'), + ); + + console.timeEnd('accept-time'); + + console.time('sign-time'); + const signDlcAcceptResponse: SignDlcAcceptResponse = await alice.dlc.signDlcAccept( + dlcOffer, + dlcAccept, + ); + dlcSign = signDlcAcceptResponse.dlcSign; + console.timeEnd('sign-time'); + + const fundTx = await bob.dlc.finalizeDlcSign( + dlcOffer, + dlcAccept, + dlcSign, + dlcTransactions, + ); + const fundTxId = await bob.chain.sendRawTransaction( + fundTx.serialize().toString('hex'), + ); + + const outcome = 38000; + oracleAttestation = generateOracleAttestation( + outcome, + oracle, + oracleBase, + 18, + 'atomic-deribit-BTC-13OCT23', + ); + + const cet = await bob.dlc.execute( + dlcOffer, + dlcAccept, + dlcSign, + dlcTransactions, + oracleAttestation, + false, + ); + const cetTxId = await bob.chain.sendRawTransaction( + cet.serialize().toString('hex'), + ); + const cetTx = await alice.getMethod('getTransactionByHash')(cetTxId); + expect(cetTx._raw.vin.length).to.equal(1); + }); + }); + /** * Currently quickFindAddress only checked the first 5000 addresses * This means DlcSign would fail if any addresses are > 5000 diff --git a/tests/integration/utils/contract.ts b/tests/integration/utils/contract.ts index a68c7394..9006aa76 100644 --- a/tests/integration/utils/contract.ts +++ b/tests/integration/utils/contract.ts @@ -1,12 +1,19 @@ -import { CoveredCall } from '@node-dlc/core'; +import { Value } from '@node-dlc/bitcoin'; +import { + buildLongCallOrderOffer, + CoveredCall, + DualFundingTxFinalizer, +} from '@node-dlc/core'; import { ContractDescriptorV1, ContractInfoV0, DigitDecompositionEventDescriptorV0, + FundingInputV0, OracleAnnouncementV0, OracleAttestationV0, OracleEventV0, OracleInfoV0, + OrderOfferV0, PayoutFunctionV0, RoundingIntervalsV0, } from '@node-dlc/messaging'; @@ -136,6 +143,66 @@ export function generateContractInfoCustomStrategyOracle( return { contractInfo, totalCollateral }; } +export function generateLongCallOffer( + oracle: Oracle, + numDigits = 18, + oracleBase = 2, + eventId = 'btc/usd', + strikePrice: number, + maxGain: Value, + premium: Value, + feePerByte: number, + roundingInterval: number, + networkName: string, +): OrderOfferV0 { + const oliviaInfo = oracle.GetOracleInfo(); + + const eventDescriptor = new DigitDecompositionEventDescriptorV0(); + eventDescriptor.base = oracleBase; + eventDescriptor.isSigned = false; + eventDescriptor.unit = 'BTC-USD'; + eventDescriptor.precision = 0; + eventDescriptor.nbDigits = numDigits; + + const event = new OracleEventV0(); + event.oracleNonces = oliviaInfo.rValues.map((rValue) => + Buffer.from(rValue, 'hex'), + ); + event.eventMaturityEpoch = 1617170572; + event.eventDescriptor = eventDescriptor; + event.eventId = eventId; + + const announcement = new OracleAnnouncementV0(); + announcement.announcementSig = Buffer.from( + oracle.GetSignature( + math + .taggedHash('DLC/oracle/announcement/v0', event.serialize()) + .toString('hex'), + ), + 'hex', + ); + + announcement.oraclePubkey = Buffer.from(oliviaInfo.publicKey, 'hex'); + announcement.oracleEvent = event; + + const oracleInfo = new OracleInfoV0(); + oracleInfo.announcement = announcement; + + const contractSize = Value.fromBitcoin(1); // Adjust this value as needed + const orderOffer = buildLongCallOrderOffer( + oracleInfo.announcement, + contractSize, + strikePrice, + maxGain, + premium, + feePerByte, + roundingInterval, + networkName, + ); + + return orderOffer; +} + export function generateOracleAttestation( outcome, oracle: Oracle, @@ -163,3 +230,39 @@ export function generateOracleAttestation( return oracleAttestation; } + +export const DEFAULT_NUM_OFFER_INPUTS = 2; +export const DEFAULT_NUM_ACCEPT_INPUTS = 3; + +export const calculateNetworkFees = (feeRate: bigint): number => { + const input = new FundingInputV0(); + input.maxWitnessLen = 108; + input.redeemScript = Buffer.from('', 'hex'); + + const fakeSPK = Buffer.from( + '0014663117d27e78eb432505180654e603acb30e8a4a', + 'hex', + ); + + const offerInputs = Array.from( + { length: DEFAULT_NUM_OFFER_INPUTS }, + () => input, + ); + + const acceptInputs = Array.from( + { length: DEFAULT_NUM_ACCEPT_INPUTS }, + () => input, + ); + + const finalizer = new DualFundingTxFinalizer( + offerInputs, + fakeSPK, + fakeSPK, + acceptInputs, + fakeSPK, + fakeSPK, + feeRate, + ); + + return Number(finalizer.offerFees + finalizer.acceptFees); +}; diff --git a/yarn.lock b/yarn.lock index 6d17187f..a62653e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,9 +19,9 @@ __metadata: version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-cfd-provider@workspace:packages/bitcoin-cfd-provider" dependencies: - "@atomicfinance/provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@types/lodash": ^4.14.160 "@types/node": 16.10.3 lodash: ^4.17.20 @@ -32,10 +32,10 @@ __metadata: version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-dlc-provider@workspace:packages/bitcoin-dlc-provider" dependencies: - "@atomicfinance/bitcoin-utils": 3.2.4 - "@atomicfinance/provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/bitcoin-utils": 3.2.5 + "@atomicfinance/provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@node-dlc/core": 0.22.4 "@node-dlc/messaging": 0.22.4 "@node-lightning/bitcoin": 0.26.1 @@ -53,16 +53,16 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/bitcoin-esplora-api-provider@^3.2.4, @atomicfinance/bitcoin-esplora-api-provider@workspace:packages/bitcoin-esplora-api-provider": +"@atomicfinance/bitcoin-esplora-api-provider@^3.2.5, @atomicfinance/bitcoin-esplora-api-provider@workspace:packages/bitcoin-esplora-api-provider": version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-esplora-api-provider@workspace:packages/bitcoin-esplora-api-provider" dependencies: - "@atomicfinance/bitcoin-utils": ^3.2.4 - "@atomicfinance/crypto": ^3.2.4 - "@atomicfinance/errors": ^3.2.4 - "@atomicfinance/node-provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/bitcoin-utils": ^3.2.5 + "@atomicfinance/crypto": ^3.2.5 + "@atomicfinance/errors": ^3.2.5 + "@atomicfinance/node-provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@babel/runtime": ^7.12.1 "@types/lodash": ^4.14.168 bignumber.js: ^9.0.0 @@ -76,10 +76,10 @@ __metadata: version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-esplora-batch-api-provider@workspace:packages/bitcoin-esplora-batch-api-provider" dependencies: - "@atomicfinance/bitcoin-esplora-api-provider": ^3.2.4 - "@atomicfinance/node-provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/bitcoin-esplora-api-provider": ^3.2.5 + "@atomicfinance/node-provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@babel/runtime": ^7.12.1 "@types/lodash": ^4.14.168 bignumber.js: ^9.0.0 @@ -92,10 +92,10 @@ __metadata: version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-js-wallet-provider@workspace:packages/bitcoin-js-wallet-provider" dependencies: - "@atomicfinance/bitcoin-utils": ^3.2.4 - "@atomicfinance/bitcoin-wallet-provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/bitcoin-utils": ^3.2.5 + "@atomicfinance/bitcoin-wallet-provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@babel/runtime": ^7.12.1 bip32: ^2.0.6 bip39: ^3.0.2 @@ -110,11 +110,11 @@ __metadata: version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-node-wallet-provider@workspace:packages/bitcoin-node-wallet-provider" dependencies: - "@atomicfinance/bitcoin-utils": ^3.2.4 - "@atomicfinance/crypto": ^3.2.4 - "@atomicfinance/jsonrpc-provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/bitcoin-utils": ^3.2.5 + "@atomicfinance/crypto": ^3.2.5 + "@atomicfinance/jsonrpc-provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@babel/runtime": ^7.12.1 "@types/lodash": ^4.14.168 bignumber.js: ^9.0.0 @@ -128,11 +128,11 @@ __metadata: version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-rpc-provider@workspace:packages/bitcoin-rpc-provider" dependencies: - "@atomicfinance/bitcoin-utils": ^3.2.4 - "@atomicfinance/errors": ^3.2.4 - "@atomicfinance/jsonrpc-provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/bitcoin-utils": ^3.2.5 + "@atomicfinance/errors": ^3.2.5 + "@atomicfinance/jsonrpc-provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@babel/runtime": ^7.12.1 "@types/lodash": ^4.14.168 bignumber.js: ^9.0.0 @@ -141,14 +141,14 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/bitcoin-utils@3.2.4, @atomicfinance/bitcoin-utils@^3.2.4, @atomicfinance/bitcoin-utils@workspace:packages/bitcoin-utils": +"@atomicfinance/bitcoin-utils@3.2.5, @atomicfinance/bitcoin-utils@^3.2.5, @atomicfinance/bitcoin-utils@workspace:packages/bitcoin-utils": version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-utils@workspace:packages/bitcoin-utils" dependencies: - "@atomicfinance/crypto": ^3.2.4 - "@atomicfinance/errors": ^3.2.4 - "@atomicfinance/types": ^3.2.4 - "@atomicfinance/utils": ^3.2.4 + "@atomicfinance/crypto": ^3.2.5 + "@atomicfinance/errors": ^3.2.5 + "@atomicfinance/types": ^3.2.5 + "@atomicfinance/utils": ^3.2.5 "@babel/runtime": ^7.12.1 "@types/bitcoinjs-lib": ^5.0.0 "@types/lodash": ^4.14.168 @@ -162,13 +162,13 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/bitcoin-wallet-provider@^3.2.4, @atomicfinance/bitcoin-wallet-provider@workspace:packages/bitcoin-wallet-provider": +"@atomicfinance/bitcoin-wallet-provider@^3.2.5, @atomicfinance/bitcoin-wallet-provider@workspace:packages/bitcoin-wallet-provider": version: 0.0.0-use.local resolution: "@atomicfinance/bitcoin-wallet-provider@workspace:packages/bitcoin-wallet-provider" dependencies: - "@atomicfinance/bitcoin-utils": ^3.2.4 - "@atomicfinance/provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 + "@atomicfinance/bitcoin-utils": ^3.2.5 + "@atomicfinance/provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 "@types/lodash": ^4.14.160 "@types/node": 16.10.3 bitcoin-networks: ^1.0.0 @@ -182,9 +182,9 @@ __metadata: version: 0.0.0-use.local resolution: "@atomicfinance/client@workspace:packages/client" dependencies: - "@atomicfinance/errors": ^3.2.4 - "@atomicfinance/provider": ^3.2.4 - "@atomicfinance/types": ^3.2.4 + "@atomicfinance/errors": ^3.2.5 + "@atomicfinance/provider": ^3.2.5 + "@atomicfinance/types": ^3.2.5 "@node-dlc/messaging": 0.22.4 "@node-lightning/bitcoin": 0.26.1 "@types/lodash": ^4.14.160 @@ -194,7 +194,7 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/crypto@^3.2.4, @atomicfinance/crypto@workspace:packages/crypto": +"@atomicfinance/crypto@^3.2.5, @atomicfinance/crypto@workspace:packages/crypto": version: 0.0.0-use.local resolution: "@atomicfinance/crypto@workspace:packages/crypto" dependencies: @@ -206,7 +206,7 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/errors@^3.2.4, @atomicfinance/errors@workspace:packages/errors": +"@atomicfinance/errors@^3.2.5, @atomicfinance/errors@workspace:packages/errors": version: 0.0.0-use.local resolution: "@atomicfinance/errors@workspace:packages/errors" dependencies: @@ -215,12 +215,12 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/jsonrpc-provider@^3.2.4, @atomicfinance/jsonrpc-provider@workspace:packages/jsonrpc-provider": +"@atomicfinance/jsonrpc-provider@^3.2.5, @atomicfinance/jsonrpc-provider@workspace:packages/jsonrpc-provider": version: 0.0.0-use.local resolution: "@atomicfinance/jsonrpc-provider@workspace:packages/jsonrpc-provider" dependencies: - "@atomicfinance/errors": ^3.2.4 - "@atomicfinance/node-provider": ^3.2.4 + "@atomicfinance/errors": ^3.2.5 + "@atomicfinance/node-provider": ^3.2.5 "@babel/runtime": ^7.12.1 "@types/json-bigint": ^1.0.0 "@types/lodash": ^4.14.168 @@ -229,12 +229,12 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/node-provider@^3.2.4, @atomicfinance/node-provider@workspace:packages/node-provider": +"@atomicfinance/node-provider@^3.2.5, @atomicfinance/node-provider@workspace:packages/node-provider": version: 0.0.0-use.local resolution: "@atomicfinance/node-provider@workspace:packages/node-provider" dependencies: - "@atomicfinance/errors": ^3.2.4 - "@atomicfinance/provider": ^3.2.4 + "@atomicfinance/errors": ^3.2.5 + "@atomicfinance/provider": ^3.2.5 "@babel/runtime": ^7.12.1 "@types/lodash": ^4.14.168 axios: ^0.21.0 @@ -242,18 +242,18 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/provider@^3.2.4, @atomicfinance/provider@workspace:packages/provider": +"@atomicfinance/provider@^3.2.5, @atomicfinance/provider@workspace:packages/provider": version: 0.0.0-use.local resolution: "@atomicfinance/provider@workspace:packages/provider" dependencies: - "@atomicfinance/types": ^3.2.4 + "@atomicfinance/types": ^3.2.5 "@types/lodash": ^4.14.160 "@types/node": 16.10.3 lodash: ^4.17.20 languageName: unknown linkType: soft -"@atomicfinance/types@^3.2.4, @atomicfinance/types@workspace:packages/types": +"@atomicfinance/types@^3.2.5, @atomicfinance/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@atomicfinance/types@workspace:packages/types" dependencies: @@ -266,13 +266,13 @@ __metadata: languageName: unknown linkType: soft -"@atomicfinance/utils@^3.2.4, @atomicfinance/utils@workspace:packages/utils": +"@atomicfinance/utils@^3.2.5, @atomicfinance/utils@workspace:packages/utils": version: 0.0.0-use.local resolution: "@atomicfinance/utils@workspace:packages/utils" dependencies: - "@atomicfinance/crypto": ^3.2.4 - "@atomicfinance/errors": ^3.2.4 - "@atomicfinance/types": ^3.2.4 + "@atomicfinance/crypto": ^3.2.5 + "@atomicfinance/errors": ^3.2.5 + "@atomicfinance/types": ^3.2.5 "@babel/runtime": ^7.12.1 bignumber.js: ^9.0.0 bip174: ^2.0.1