Skip to content

Commit

Permalink
fix: add payout index find fallback
Browse files Browse the repository at this point in the history
Ensures if payout doesn't match up, it'll still find the correct outcome
index in FindOutcomeIndexFromHyperbolaPayoutCurvePiece
  • Loading branch information
matthewjablack committed Oct 1, 2024
1 parent 3056c6f commit 32a6994
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 15 deletions.
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,5 @@
},
"publishConfig": {
"access": "public"
},
"packageManager": "yarn@3.2.0"
}
}
19 changes: 6 additions & 13 deletions packages/bitcoin-dlc-provider/lib/BitcoinDlcProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1352,7 +1352,6 @@ Payout Group not found',
let index = 0;
let groupIndex = -1;
let groupLength = 0;
const payoutGroupFound = false;

for (const [i, payoutGroup] of payoutGroups.entries()) {
if (payoutGroup.payout === roundedPayout) {
Expand All @@ -1365,7 +1364,8 @@ Payout Group not found',
break;
}
} else if (
payoutGroup.payout === BigInt(Math.round(Number(payout.toString())))
payoutGroup.payout === BigInt(Math.round(Number(payout.toString()))) &&
i !== 0
) {
// Edge case to account for case where payout is maximum payout for DLC
// But rounded payout does not round down
Expand All @@ -1388,17 +1388,10 @@ 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',
);
}
throw Error(
'Failed to Find OutcomeIndex From HyperbolaPayoutCurvePiece. \
Payout Group not found',
);
}

return { index: payoutIndexOffset + index, groupLength };
Expand Down
1 change: 1 addition & 0 deletions tests/integration/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ async function getInput(
maxWitnessLength: 108,
redeemScript: '',
toUtxo: Input.prototype.toUtxo,
toOutPoint: Input.prototype.toOutPoint,
};

return input;
Expand Down
20 changes: 20 additions & 0 deletions tests/integration/dlc/dlc.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ import {
import { Input } from '../../../packages/types';
import { chains, getInput } from '../common';
import f from '../fixtures/blockchain.json';
import {
attestation_for_payout_amount_failure as AttestationWithPayoutAmountFailure,
offer_with_payout_index_by_payout_amount_failure as OfferWithPayoutIndex,
} from '../fixtures/messages.json';
import Oracle from '../models/Oracle';
import {
calculateNetworkFees,
Expand Down Expand Up @@ -1486,6 +1490,22 @@ describe('external test vectors', () => {
const cetTx = await alice.getMethod('getTransactionByHash')(cetTxId);
expect(cetTx._raw.vin.length).to.equal(1);
});

it('should fallback to brute force finding payout index if find by payout fails', async () => {
const dlcOffer = DlcOfferV0.deserialize(
Buffer.from(OfferWithPayoutIndex, 'hex'),
);
const oracleAttestation = OracleAttestationV0.deserialize(
Buffer.from(AttestationWithPayoutAmountFailure, 'hex'),
);

const { index: outcomeIndex, groupLength } = await carol.getMethod(
'FindOutcomeIndex',
)(dlcOffer, oracleAttestation);

expect(outcomeIndex).to.be.equal(19);
expect(groupLength).to.be.equal(9);
});
});

const randomIntFromInterval = (min, max) => {
Expand Down
4 changes: 4 additions & 0 deletions tests/integration/fixtures/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"offer_with_payout_index_by_payout_amount_failure": "a71a006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000fdd82efd0341000000000055a232fda7204f0012fda7263b000100fe0055a2320000fda72a25010100000000fe05f5e100000001010000010000000100000001ff0000055db36778000000fe0003ffff000000fda7240a000200fd1388fde67801fda712fd02e0fdd824fd02da06315e57c0d437cc1634ec4b0aee2d613dd64b5ca3f91eecb0e140808fbd3a19e3ee2cebbd41285025ca1f6667cc99beb001e5e38016ed97f04c15d7b749c94930bbf19aa3a986ed4e5640240b507901d6e03d6bbd71a281ed356a145516c655fdd822fd0274001295ec10ffcdfcb6caa70e92c7778d099baa41b875b0506fee5a6c426ac35d992f250fb7d4e4f3d3e79989073c294040cad7736350dc1102d9bf6cd1f524fb6f8bfd86fded7df39438788d92f850a990d27ac58c5157b134dc53880e28ec1187356f77b5819cd88728300b30fab9ca27f18cceaea7c8dfac3f86db8e833a84342e29c7aee52ce7d0efedca2b56458bfbea558993036e6ef57a3691305b1d88b251fe7daa82a4aae6092163af24a70ece6f1b62cfa5ba30f1b31a4a4829bf769b1db46a160a997811168efd478edfabf43e62c86dc20f7fb9667d9f3c174294b27410130c13d0576e3e36b270840ec3e1b070afc897c56b97330865c3a5e3d57425fe581a861a8b56ddac9f6ba2d01113f31bb34afd734b2ae540d360c8ccadaeb90b85516c808b757de2a1c087d269f84488a7fab0810982277dce598218a8fc0951aa11365e49283918a8c5fe676b964dcd67ad48899dd1fbb727335f308d529934625029e029085218b7541ae9d80e264f82c28b483b279c860122b0bc653c74575fb6eaba2f05553f4c553016808a82527fc809c6f3850a10cbfa6d8595e396e7f66258763633108c8df08b641de9dc3790b13b5c1e93978d444ee408fd44704529b56c60482bb217049f0a0c50a556d71b237983a0818f52341574b96ae64da5a39a127421e9dc62dee328ddce4883bab35e66c4a7f94047f9d7564bb6e525971ff915eea8c93cc2589fa14210d8c3850701a5c3f45ecc4faf025d6ca763e9d2febbdee807d0c5160e8c0ec7fb0b73e4df1966c5d553a1338faea48014ec8b66dab680fdd80a10000200064254435553440000000000121961746f6d69632d646572696269742d4254432d36534550323403fcffcd79695d8818434bf3694a70010971668667e258389ddd4aaa2a405a2a070016001415d252d2488c1bc0039fca0d84fb7fb724d5cb23000000000023d2ca00000000004e01120002fda714f500000000000d932d00df020000000001010168545b168d246ba314b1bd5d98f09c6a19f7ba6ee1102b3e0c480b9ee71f370100000000fdffffff0260ae0a00000000001600147e7d7ee522eeda3166ba5471dfe262bae6604205a05a010000000000160014face8940cb898bb9d9eac13e29b62b5a4207b6380248304502210088037e9d5392fca2185def6275a0142cdff098921529ad597c0ad63b89ca983d02207a060ed2fd2424950ab82d61d36b74dc8522606be01d5d77d53e0a119429f82601210227cf9bb682f4d5db3ebf9b2eea9a330be8d9faf304412f3bda841b8dbb47fd9c0000000000000000ffffffff006c0000fda714f4000000000014aaf400de02000000000101d5be4a5e8e4a5c0de61e9dad5195e3df7c3f1e8b29032b90f8397abd244631d80300000000fdffffff02907f4f00000000001600140eab755e3c79c2757315e7589079382a0d4d8879be0b0c0000000000160014face8940cb898bb9d9eac13e29b62b5a4207b6380247304402206738e4f14747748fc63e5274ffc78c5578813669d279f1e79676f6f05264938d02200a508ab89d28f0fa3910be2dbfedf5d604dc180b78195feb897d9e70e6e9c5b701210227cf9bb682f4d5db3ebf9b2eea9a330be8d9faf304412f3bda841b8dbb47fd9c0000000000000000ffffffff006c00000016001445a489167e3f1e08b5aa996ef80c7830f4234d7d00000000000201400000000000438d48000000000000000666c4b9ba66ffa080fdf538321041303562695142754674426b7132415502bb46d17fdf7927f1279765bc3654cb5b65273636262473bfcb2837f6bb837a18fdf53a2f000000000000000000124254432d3653455032342d35393030302d500000000005f5e1000100000000004df8f00000",
"attestation_for_payout_amount_failure": "fdd868fd04e01961746f6d69632d646572696269742d4254432d36534550323430bbf19aa3a986ed4e5640240b507901d6e03d6bbd71a281ed356a145516c655001295ec10ffcdfcb6caa70e92c7778d099baa41b875b0506fee5a6c426ac35d992f69ba6ed2b31588da9f6fecc71d4e523529c8b27063ddd23b4add120f13f48b83250fb7d4e4f3d3e79989073c294040cad7736350dc1102d9bf6cd1f524fb6f8b9ea2d9a1aec8cbece094ea9cf47dfe828f914034b19a7312fce0769f8edd09c6fd86fded7df39438788d92f850a990d27ac58c5157b134dc53880e28ec118735026e17ad6304cd94e38eeb0fcdb5543fd6c7747a98516187abf0873f2874de6c6f77b5819cd88728300b30fab9ca27f18cceaea7c8dfac3f86db8e833a84342e4ba2034274d2335a73be6f3b45c74347f3abe28b4b2abcdc9d1cc1de4e5d48ef29c7aee52ce7d0efedca2b56458bfbea558993036e6ef57a3691305b1d88b2513754dfd639f9bc6eb1f08aab5fe1a7025af9c7e02a22926738bbd04a8fb5e126fe7daa82a4aae6092163af24a70ece6f1b62cfa5ba30f1b31a4a4829bf769b1d8bb816495555a945b0eb05f27659f4d4beda66f3dfbd259e110b78d8d5f8233fb46a160a997811168efd478edfabf43e62c86dc20f7fb9667d9f3c174294b27441bb5e1f967dd229cf072a614ad6feb91faec3aae509fe403095b4cf9afa4d6c10130c13d0576e3e36b270840ec3e1b070afc897c56b97330865c3a5e3d57425d10b1940217551117c589e63cda0df76758da5f2ec54003273cb5406592356fefe581a861a8b56ddac9f6ba2d01113f31bb34afd734b2ae540d360c8ccadaeb96b7ca78efa10bcb92f242d67ff437027c05fd3e9d488b0584b8cbf61093af4df0b85516c808b757de2a1c087d269f84488a7fab0810982277dce598218a8fc095f8b7f21ef112360f211edfd5fdef5f81e80e388a92797ef627cf2b5bc247d1051aa11365e49283918a8c5fe676b964dcd67ad48899dd1fbb727335f308d52999b9320eae5dbc0ce11d8353c935b963ba8c31dded0de9ad2b93d34a520b27dc434625029e029085218b7541ae9d80e264f82c28b483b279c860122b0bc653c747aee25224ebb15f6a45570f6727ecd8181613468870032471feaf95fa31cb651575fb6eaba2f05553f4c553016808a82527fc809c6f3850a10cbfa6d8595e3962484fed19211d6c6165989499efab819671ac95b9da96f050c4fca156648bc12e7f66258763633108c8df08b641de9dc3790b13b5c1e93978d444ee408fd447048dc3325fa33c8542e53a17e9ee4d5eda9822fc39f3e33d7bddca607725d47374529b56c60482bb217049f0a0c50a556d71b237983a0818f52341574b96ae64d352eeb7bc1ececd0fdc68af07bc85719a24aac3b1ed484ce77d5a1d69f2fa446a5a39a127421e9dc62dee328ddce4883bab35e66c4a7f94047f9d7564bb6e525d17fdd58f1af01a8525e99099660a601fe8f30b379e5641c95282dfcc9ce19c1971ff915eea8c93cc2589fa14210d8c3850701a5c3f45ecc4faf025d6ca763e992de11ab7c7cc2cf01c338c1b6781b44f20680430e1b5f67712fa23ccf61f5d3d2febbdee807d0c5160e8c0ec7fb0b73e4df1966c5d553a1338faea48014ec8bba09a040141eb343f662988d30863d22a4bfef850ba848fd4c324e19bc3587cb013001300131013101300131013101300130013101300130013101310131013101310131"
}

0 comments on commit 32a6994

Please sign in to comment.