From d7f986625f7aed27ecd599569b27c51249e13657 Mon Sep 17 00:00:00 2001 From: samsiegart Date: Mon, 20 May 2024 11:41:53 -0700 Subject: [PATCH 1/3] fix: use unique offer descriptions for swaps --- contract/,tx.json | 0 contract/src/swaparoo.contract.js | 14 +++++++++++++- contract/test/snapshots/test-swap-wallet.js.md | 2 +- .../test/snapshots/test-swap-wallet.js.snap | Bin 898 -> 911 bytes contract/test/test-swap-wallet.js | 13 +++++++++++-- yarn.lock | 2 +- 6 files changed, 26 insertions(+), 5 deletions(-) delete mode 100644 contract/,tx.json diff --git a/contract/,tx.json b/contract/,tx.json deleted file mode 100644 index e69de29b..00000000 diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index cf393b2e..06aabcdd 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -121,6 +121,17 @@ export const start = async (zcf, privateArgs, baggage) => { // TODO: update with Fee param const feeShape = makeNatAmountShape(feeBrand, params.getFee().value); + const generateOfferNonce = (() => { + // XXX: This is not stored durably, so ensure it stays unique after upgrade, + // perhaps by appending a new character each time. + let offerNonce = -1; + + return () => { + offerNonce += 1; + return `${offerNonce}`; + }; + })(); + /** * @param { ZCFSeat } firstSeat * @param {{ addr: string }} offerArgs @@ -158,9 +169,10 @@ export const start = async (zcf, privateArgs, baggage) => { return swapWithFee(zcf, firstSeat, secondSeat, feeSeat, params.getFee()); }; + const description = `matchOffer-${generateOfferNonce()}`; const secondSeatInvitation = await zcf.makeInvitation( secondSeatOfferHandler, - 'matchOffer', + description, { give: give1, want: want1 }, // "give" and "want" are from the proposer's perspective ); diff --git a/contract/test/snapshots/test-swap-wallet.js.md b/contract/test/snapshots/test-swap-wallet.js.md index 9d356e00..2e20c53d 100644 --- a/contract/test/snapshots/test-swap-wallet.js.md +++ b/contract/test/snapshots/test-swap-wallet.js.md @@ -49,7 +49,7 @@ Generated by [AVA](https://avajs.dev). { id: 'jack-123', invitationSpec: { - description: 'matchOffer', + description: 'matchOffer-0', instance: Object @Alleged: InstanceHandle {}, source: 'purse', }, diff --git a/contract/test/snapshots/test-swap-wallet.js.snap b/contract/test/snapshots/test-swap-wallet.js.snap index b8134522c6d911e26a6c661ae64f7b06ca0a172a..de8f920a640830aad8b3de0c627376d24c41dc09 100644 GIT binary patch literal 911 zcmV;A191F7RzV9NS|~lVXq1(; zqqU8pIt_Z?lfL)8_rCdVbr3}Ex_-Q^Qa=sU+CXaG?dmNV`#O}dz89tX$+qXoRDR@q z$#D$XLv?a41Goxc2;eIK+W_XM)}h+%!J2YYqT<+Yw?QXB0@T7BvDb)$oDMPH8y{z7 z;Ja!e`|&~#)FgTVU>t4w;ijL;)Q`eDv2sm(w-i4ft*)x1pA5AL&C_0}9w$*8X&D&O zeFAP0APIO(z)P}7vq{o*V!sivYs2a`jGtz}8w^-v7WDWu8Ja}PtVGfebt*$wnaF2s zYUO!(69S%!M}xq3mkZ1-xvr9NbZ$egt0h0t=^nuPKut%Z#8m|kHwx24x~btw7FbBn zD?Z+k!zl6H-kNmR4VoG5-(Q3s{0~Pq6ljRa;vBoUc>$aiz@o5N zH!9=!z5qTHKx9KtRG?oA;F$n^u%WGr7R+ezvoKmTi2f2Vl@+qQjqiV3{7a--{OJyJ=o(j@d)hh8tBAK!Rq zsegCng9Grh<>4;yhNgkHL9>;lc85+*@EPM(AO|YAZw#}Wt+?(Q`+Mcm{6Wd3#YF&D z0DKDI(cuow_jl-ew&@GK^NU9CZw_(i9qePl;tv3S19+Q&>xbGe9}=)Zz*8G44kh34 zly(z8&WIKF%!W+ed$%*a7S83B&{Q8j$R?e5lxS5Nza5(9db{*LxZXSi&f0g1Q!%q1 z11{OHdPSn#h3+uhg^JKawvUC?i9ct+j|}+9{!gvawO<+VI|I1wuhrWySMW`K^aU=G lSB{pPIY)J)r!QLtIdkAH=erqat5ROg{{Y=7_dsU}0005zzMTL7 literal 898 zcmV-|1AY8KRzV95%6 z32l(n=O2p*00000000B6RnKb^K@{G%KhiWwo5a>uib76$DjG|BC_R{3tCf~gwcw9~ zOg7VWo9*tpvuUjeQbD|V62yZC3*tfi4?KxT!Ha){7X|4-6vTtRopd*w*|Z^G$Rm?| z-%P&u&3j*7u9Qt%ud(eN>KUF%*UE$$dVy^c$6yw5*sATZhdY%D@yHGBks|d-{tJ?z zP2%S{j4H-sj2(;tNaP{0SYD&L2M{iExts)j5~vbn5hD+RB7v3%*{B4|3^5Izj`}}5 zT9lw4;2oY9Wcv+k!|;e_*w$5t>O8*}$@khTE7UEyRmM|8&`c#A*LG}1OisFlnTr?% zV;kc=2&Cm!(n*lNB4kg5B}JGrEKAY}j4@e&_O_D&NzTa;l7_`RV(FA;?#gW|ZgG@JE~#xc%+Bw6Ya(X>|fWr!a0~Jm~Du%E1nu z^e26^cy^2n{=9=b?@9+)u=)ctzcEgsr8p#rUYzGMXzRjmW&D1@Sr7G z^q??xUp~OV@FHGg?k&a#@plrjJNtr=Zx|rDYy7{kplmGw# diff --git a/contract/test/test-swap-wallet.js b/contract/test/test-swap-wallet.js index 675c84d4..16dbe219 100644 --- a/contract/test/test-swap-wallet.js +++ b/contract/test/test-swap-wallet.js @@ -161,6 +161,7 @@ const startAlice = async ( * @param {MockWallet} wallet * @param {Amount} beansAmount * @param {Amount} cowsAmount + * @param {string} offerDescription * @param {boolean} [jackPays] */ const startJack = async ( @@ -169,6 +170,7 @@ const startJack = async ( wallet, beansAmount, cowsAmount, + offerDescription, jackPays = false, ) => { const instance = wellKnown.instance[contractName]; @@ -188,7 +190,7 @@ const startJack = async ( invitationSpec: { source: 'purse', instance, - description: 'matchOffer', + description: offerDescription, }, proposal, }; @@ -278,7 +280,14 @@ test.serial('basic swap', async t => { await E(E.get(bldIssuerKit).mint).mintPayment(cowAmount), ); const jackSeat = seatLike( - await startJack(t, wellKnown, wallet.jack, fiveBeans, cowAmount), + await startJack( + t, + wellKnown, + wallet.jack, + fiveBeans, + cowAmount, + 'matchOffer-0', + ), ); const jackPayouts = await jackSeat.getPayoutAmounts(); diff --git a/yarn.lock b/yarn.lock index 5c9807b1..266777ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8453,7 +8453,7 @@ eslint@^8.47.0, eslint@^8.56.0: strip-ansi "^6.0.1" text-table "^0.2.0" -esm@agoric-labs/esm#Agoric-built, "esm@github:agoric-labs/esm#Agoric-built": +esm@agoric-labs/esm#Agoric-built: version "3.2.25" resolved "https://codeload.github.com/agoric-labs/esm/tar.gz/3603726ad4636b2f865f463188fcaade6375638e" From 3b409ff0b3ee37a8b0f7e78a6099364ee1b08c70 Mon Sep 17 00:00:00 2001 From: samsiegart Date: Tue, 21 May 2024 00:37:49 -0700 Subject: [PATCH 2/3] feat: store offerNonce durably --- contract/package.json | 1 + contract/src/swaparoo.contract.js | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contract/package.json b/contract/package.json index 2d5403ce..fe6392cf 100644 --- a/contract/package.json +++ b/contract/package.json @@ -54,6 +54,7 @@ "@agoric/governance": "^0.10.4-u14.0", "@agoric/inter-protocol": "0.16.2-u14.1", "@agoric/vats": "0.15.2-u14.0", + "@agoric/vat-data": "0.5.3-u14.0", "@agoric/zoe": "^0.26.3-u14.0", "@endo/bundle-source": "^2.8.0", "@endo/far": "^0.2.22", diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index 06aabcdd..2a7a7a4e 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -17,6 +17,7 @@ import { CONTRACT_ELECTORATE } from '@agoric/governance/src/contractGovernance/g import { handleParamGovernance } from '@agoric/governance/src/contractHelper.js'; import { makeCollectFeesInvitation } from './collectFees.js'; import { fixHub } from './fixHub.js'; +import { provide } from '@agoric/vat-data'; /** @template [Slot=unknown] @typedef {import('@endo/marshal').Marshal} Marshaller */ @@ -122,13 +123,14 @@ export const start = async (zcf, privateArgs, baggage) => { const feeShape = makeNatAmountShape(feeBrand, params.getFee().value); const generateOfferNonce = (() => { - // XXX: This is not stored durably, so ensure it stays unique after upgrade, - // perhaps by appending a new character each time. - let offerNonce = -1; + // Provide the nonce durably so it can stay unique if contract upgrades. + // See: https://docs.agoric.com/guides/zoe/contract-upgrade.html#durability + let offerNonce = provide(baggage, 'offerNonce', () => -1); return () => { offerNonce += 1; - return `${offerNonce}`; + baggage.set('offerNonce', offerNonce); + return offerNonce; }; })(); From ff44ea3fddeae250f1312192421d40c32f279c73 Mon Sep 17 00:00:00 2001 From: samsiegart Date: Tue, 21 May 2024 00:40:59 -0700 Subject: [PATCH 3/3] fix: lint --- contract/src/swaparoo.contract.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contract/src/swaparoo.contract.js b/contract/src/swaparoo.contract.js index 2a7a7a4e..dcccb8aa 100644 --- a/contract/src/swaparoo.contract.js +++ b/contract/src/swaparoo.contract.js @@ -15,9 +15,9 @@ import { import { ParamTypes } from '@agoric/governance/src/constants.js'; import { CONTRACT_ELECTORATE } from '@agoric/governance/src/contractGovernance/governParam.js'; import { handleParamGovernance } from '@agoric/governance/src/contractHelper.js'; +import { provide } from '@agoric/vat-data'; import { makeCollectFeesInvitation } from './collectFees.js'; import { fixHub } from './fixHub.js'; -import { provide } from '@agoric/vat-data'; /** @template [Slot=unknown] @typedef {import('@endo/marshal').Marshal} Marshaller */