diff --git a/packages/pegasus/src/courier.js b/packages/pegasus/src/courier.js index 461fa7031c1..a940673bed5 100644 --- a/packages/pegasus/src/courier.js +++ b/packages/pegasus/src/courier.js @@ -33,7 +33,7 @@ export const getCourierPK = (key, keyToCourierPK) => { * @property {ContractFacet} zcf * @property {ERef} board * @property {ERef} namesByAddress - * @property {Denom} remoteDenom + * @property {Denom} sendDenom * @property {Brand} localBrand * @property {(zcfSeat: ZCFSeat, amounts: AmountKeywordRecord) => void} retain * @property {(zcfSeat: ZCFSeat, amounts: AmountKeywordRecord) => void} redeem @@ -47,7 +47,7 @@ export const makeCourierMaker = zcf, board, namesByAddress, - remoteDenom, + sendDenom, localBrand, retain, redeem, @@ -59,7 +59,7 @@ export const makeCourierMaker = const amount = zcfSeat.getAmountAllocated('Transfer', localBrand); const transferPacket = await E(transferProtocol).makeTransferPacket({ value: amount.value, - remoteDenom, + remoteDenom: sendDenom, depositAddress, }); diff --git a/packages/pegasus/src/pegasus.js b/packages/pegasus/src/pegasus.js index f59b092189b..db4b3759085 100644 --- a/packages/pegasus/src/pegasus.js +++ b/packages/pegasus/src/pegasus.js @@ -117,18 +117,34 @@ const makePegasus = (zcf, board, namesByAddress) => { /** @type {PegasusConnectionActions} */ const pegasusConnectionActions = Far('pegasusConnectionActions', { - async rejectStuckTransfers(receiveDenom) { + async rejectTransfersWaitingForPegRemote(remoteDenom) { checkAbort(); const { receiveDenomToCourierPK } = localDenomState; + const { receiveDenom } = await E( + denomTransformer, + ).getDenomsForRemotePeg( + remoteDenom, + localDenomState.localAddr, + localDenomState.remoteAddr, + ); + checkAbort(); + const { reject, promise } = receiveDenomToCourierPK.get(receiveDenom); + + // Only continue if the promise isn't already resolved. + const raceWinner = await Promise.race([promise, null]); + checkAbort(); + + assert(!raceWinner, X`${receiveDenom} is already resolved`); + // If rejected, the rejection is returned to our caller, so we have // handled it correctly and that flow doesn't need to trigger an // additional UnhandledRejectionWarning in our vat. promise.catch(() => {}); reject(assert.error(X`${receiveDenom} is temporarily unavailable`)); - // Allow new transfers to be initiated. + // Allow new transfers to be initiated after this rejection. receiveDenomToCourierPK.delete(receiveDenom); }, async pegRemote( @@ -165,7 +181,7 @@ const makePegasus = (zcf, board, namesByAddress) => { localBrand, board, namesByAddress, - remoteDenom: sendDenom, + sendDenom, retain: (zcfSeat, amounts) => zcfMint.burnLosses(harden(amounts), zcfSeat), redeem: (zcfSeat, amounts) => { @@ -241,7 +257,7 @@ const makePegasus = (zcf, board, namesByAddress) => { zcf, board, namesByAddress, - remoteDenom: sendDenom, + sendDenom, localBrand, retain: (transferSeat, amounts) => transferAmountFrom( diff --git a/packages/pegasus/src/types.js b/packages/pegasus/src/types.js index 2d617373628..b0cec1fd4da 100644 --- a/packages/pegasus/src/types.js +++ b/packages/pegasus/src/types.js @@ -55,7 +55,7 @@ */ /** - * @callback RejectStuckTransfers + * @callback RejectTransfersWaitingForPegRemote * Abort any in-progress receiveDenom transfers if there has not yet been a * pegRemote or pegLocal corresponding to it. * @@ -93,7 +93,7 @@ * @typedef {Object} PegasusConnectionActions * @property {PegLocal} pegLocal * @property {PegRemote} pegRemote - * @property {RejectStuckTransfers} rejectStuckTransfers + * @property {RejectTransfersWaitingForPegRemote} rejectTransfersWaitingForPegRemote * @property {(reason?: any) => void} abort */ diff --git a/packages/pegasus/test/test-peg.js b/packages/pegasus/test/test-peg.js index f5189ca7f04..f9b5dedb501 100644 --- a/packages/pegasus/test/test-peg.js +++ b/packages/pegasus/test/test-peg.js @@ -212,7 +212,7 @@ async function testRemotePeg(t) { // Wait for the packet to go through. t.deepEqual(await remoteDenomAit.next(), { done: false, value: 'umuon' }); - E(pegConnActions).rejectStuckTransfers('umuon'); + E(pegConnActions).rejectTransfersWaitingForPegRemote('umuon'); const sendAckData3 = await sendAckData3P; const sendAck3 = JSON.parse(sendAckData3);