@@ -3,6 +3,7 @@ import '@endo/init';
3
3
import { iterateLatest , makeFollower , makeLeader } from '@agoric/casting' ;
4
4
import { M , matches } from '@agoric/store' ;
5
5
import { Offers } from '@agoric/inter-protocol/src/clientSupport.js' ;
6
+ import { objectMap } from '@agoric/internal' ;
6
7
import {
7
8
boardSlottingMarshaller ,
8
9
getNetworkConfig ,
@@ -12,49 +13,72 @@ import { coalesceWalletState, outputExecuteOfferAction } from './lib/wallet.js';
12
13
import { normalizeAddressWithOptions } from './lib/chain.js' ;
13
14
import { makeAmountFormatter } from './lib/format.js' ;
14
15
15
- const { entries , fromEntries , values } = Object ;
16
+ const { values } = Object ;
16
17
17
- const mapValues = ( obj , fn ) =>
18
- fromEntries ( entries ( obj ) . map ( ( [ prop , val ] ) => [ prop , fn ( val ) ] ) ) ;
18
+ const makeFormatters = assets => {
19
+ const fmtAmtTuple = makeAmountFormatter ( assets ) ;
20
+ /** @param {Amount } amt */
21
+ const amount = amt => ( ( [ l , m ] ) => `${ m } ${ l } ` ) ( fmtAmtTuple ( amt ) ) ;
22
+ /** @param {Record<string, Amount> | undefined } r */
23
+ const record = r => ( r ? objectMap ( r , amount ) : undefined ) ;
24
+ /** @param {Ratio } r */
25
+ const price = r => {
26
+ const [ nl , nm ] = fmtAmtTuple ( r . numerator ) ;
27
+ const [ dl , dm ] = fmtAmtTuple ( r . denominator ) ;
28
+ return `${ Number ( nm ) / Number ( dm ) } ${ nl } /${ dl } ` ;
29
+ } ;
30
+ const discount = r =>
31
+ 100 - ( Number ( r . numerator . value ) / Number ( r . denominator . value ) ) * 100 ;
32
+ return { amount, record, price, discount } ;
33
+ } ;
19
34
20
35
const fmtMetrics = ( metrics , quote , assets ) => {
21
- const fmtAmtTuple = makeAmountFormatter ( assets ) ;
22
- const fmtAmt = amt => ( ( [ l , m ] ) => `${ m } ${ l } ` ) ( fmtAmtTuple ( amt ) ) ;
36
+ const fmt = makeFormatters ( assets ) ;
23
37
const { liquidatingCollateral, liquidatingDebt } = metrics ;
24
38
25
39
const {
26
40
quoteAmount : {
27
41
value : [ { amountIn, amountOut } ] ,
28
42
} ,
29
43
} = quote ;
30
- // TODO: divide num, denom by GCD
31
- const price = `${ fmtAmt ( amountOut ) } /${ fmtAmt ( amountIn ) } }` ;
44
+ const price = fmt . price ( { numerator : amountOut , denominator : amountIn } ) ;
32
45
33
- const amounts = mapValues ( { liquidatingCollateral, liquidatingDebt } , fmtAmt ) ;
46
+ const amounts = objectMap (
47
+ { liquidatingCollateral, liquidatingDebt } ,
48
+ fmt . amount ,
49
+ ) ;
34
50
return { ...amounts , price } ;
35
51
} ;
36
52
53
+ /**
54
+ * @param {import('@agoric/smart-wallet/src/offers.js').OfferStatus &
55
+ * { offerArgs: import('@agoric /inter-protocol/src/auction/auctionBook.js').BidSpec }} bid
56
+ * @param {import('./lib/format.js').AssetDescriptor[] } assets
57
+ */
37
58
export const fmtBid = ( bid , assets ) => {
38
- const fmtAmtTuple = makeAmountFormatter ( assets ) ;
39
- const fmtAmt = amt => ( ( [ l , m ] ) => `${ m } ${ l } ` ) ( fmtAmtTuple ( amt ) ) ;
40
- const fmtRecord = r => ( r ? mapValues ( r , fmtAmt ) : undefined ) ;
59
+ const fmt = makeFormatters ( assets ) ;
60
+
61
+ const { offerArgs } = bid ;
62
+ /** @type {{ price: string } | { discount: number } } */
63
+ const spec =
64
+ 'offerPrice' in offerArgs
65
+ ? { price : fmt . price ( offerArgs . offerPrice ) }
66
+ : { discount : fmt . discount ( offerArgs . offerBidScaling ) } ;
41
67
42
68
const {
43
69
id,
44
70
error,
45
71
proposal : { give } ,
46
- offerArgs : { want, offerPrice } , // TODO: other kind of bid
72
+ offerArgs : { want } ,
47
73
payouts,
48
74
} = bid ;
49
- const amounts = {
50
- give : give ? fmtRecord ( give ) : undefined ,
51
- want : want ? fmtAmt ( want ) : undefined ,
52
- price : offerPrice
53
- ? `${ fmtAmt ( offerPrice . numerator ) } /${ fmtAmt ( offerPrice . denominator ) } }`
54
- : undefined ,
55
- payouts : fmtRecord ( payouts ) ,
75
+ const props = {
76
+ ...( give ? { give : fmt . record ( give ) } : { } ) ,
77
+ ...( want ? { want : fmt . amount ( want ) } : { } ) ,
78
+ ...( payouts ? { payouts : fmt . record ( payouts ) } : { } ) ,
79
+ ...( error ? { error } : { } ) ,
56
80
} ;
57
- return harden ( { id, ...amounts , error } ) ;
81
+ return harden ( { id, ...spec , ... props } ) ;
58
82
} ;
59
83
60
84
/** distinguish IO errors etc. from logic bugs */
0 commit comments