Skip to content

Commit b7fd6f1

Browse files
authored
fix: min coin computation for byron addresses (#1942)
* chore: remove unused minimum coin quantity code it was probably replaced with something else * chore: bump cardano-js-sdk packages in order to apply min coin value fix for outputs with Byron address
1 parent 08a708b commit b7fd6f1

File tree

13 files changed

+321
-279
lines changed

13 files changed

+321
-279
lines changed

apps/browser-extension-wallet/package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@
5656
},
5757
"dependencies": {
5858
"@ant-design/icons": "^4.7.0",
59-
"@cardano-sdk/cardano-services-client": "0.26.18",
60-
"@cardano-sdk/core": "0.46.2",
61-
"@cardano-sdk/dapp-connector": "0.13.16",
62-
"@cardano-sdk/input-selection": "0.14.17",
63-
"@cardano-sdk/tx-construction": "0.27.4",
59+
"@cardano-sdk/cardano-services-client": "0.26.19",
60+
"@cardano-sdk/core": "0.46.3",
61+
"@cardano-sdk/dapp-connector": "0.13.17",
62+
"@cardano-sdk/input-selection": "0.14.18",
63+
"@cardano-sdk/tx-construction": "0.28.0",
6464
"@cardano-sdk/util": "0.17.0",
65-
"@cardano-sdk/util-rxjs": "0.9.19",
66-
"@cardano-sdk/wallet": "0.53.5",
67-
"@cardano-sdk/web-extension": "0.39.15",
65+
"@cardano-sdk/util-rxjs": "0.9.20",
66+
"@cardano-sdk/wallet": "0.53.7",
67+
"@cardano-sdk/web-extension": "0.39.17",
6868
"@emurgo/cip14-js": "~3.0.1",
6969
"@input-output-hk/lace-ui-toolkit": "3.5.0",
7070
"@lace/bitcoin": "0.1.0",
@@ -119,7 +119,7 @@
119119
"zustand": "3.5.14"
120120
},
121121
"devDependencies": {
122-
"@cardano-sdk/hardware-ledger": "0.16.5",
122+
"@cardano-sdk/hardware-ledger": "0.16.7",
123123
"@emurgo/cardano-message-signing-asmjs": "1.0.1",
124124
"@openpgp/web-stream-tools": "0.0.11-patch-0",
125125
"@pdfme/common": "^4.0.2",

apps/browser-extension-wallet/src/features/send/__tests__/selectors.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,9 @@ describe('Testing sendTransactionSelector', () => {
2424
expect(result.current).toHaveProperty('transactionValue');
2525
expect(result.current).toHaveProperty('transaction');
2626
expect(result.current).toHaveProperty('transactionFeeLovelace');
27-
expect(result.current).toHaveProperty('minimumCoinQuantity');
2827
expect(result.current).toHaveProperty('setDestinationAddress');
2928
expect(result.current).toHaveProperty('setTransactionValue');
3029
expect(result.current).toHaveProperty('setTransaction');
3130
expect(result.current).toHaveProperty('setTransactionFeeLovelace');
32-
expect(result.current).toHaveProperty('setMinimumCoinQuantity');
3331
});
3432
});
Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
import { availableCoinsTransformer, displayedCoinsTransformer } from '../transformers';
2-
import { mockAvailableBalance, mockDisplayedCoins } from '../../../../utils/mocks/test-helpers';
3-
import { TxMinimumCoinQuantity } from '../../../../types';
1+
import { availableCoinsTransformer } from '../transformers';
2+
import { mockAvailableBalance } from '../../../../utils/mocks/test-helpers';
43
import { firstValueFrom } from 'rxjs';
54

65
const assetId = '659f2917fb63f12b33667463ee575eeac1845bbc736b9c0bbc40ba8254534c41';
7-
const minimumCoinQuantity: TxMinimumCoinQuantity = {
8-
coinMissing: '2000000',
9-
minimumCoin: '2500000'
10-
};
116

127
describe('Testing availableCoinsTransformer function', () => {
138
it('should return parsed available coins', async () => {
@@ -27,32 +22,3 @@ describe('Testing availableCoinsTransformer function', () => {
2722
]);
2823
});
2924
});
30-
31-
describe('Testing displayedCoinsTransformer function', () => {
32-
it('should return only coins field if no assets are displayed', () => {
33-
const result = displayedCoinsTransformer(mockDisplayedCoins);
34-
expect(result.coins.toString()).toBe('0');
35-
});
36-
37-
it('should return coins and assets fields when both are displayed', () => {
38-
const result = displayedCoinsTransformer([...mockDisplayedCoins, { amount: '5', coinId: assetId }]);
39-
expect(result.coins.toString()).toBe('0');
40-
expect(result.assets).toEqual(new Map([[assetId, BigInt('5')]]));
41-
});
42-
43-
it(
44-
'should return default minimum coin quantity as coins ' +
45-
'if displayed coins list only has assets and no minimum is provided',
46-
() => {
47-
const result = displayedCoinsTransformer([{ amount: '5', coinId: assetId }]);
48-
expect(result.coins.toString()).toBe('1000000');
49-
expect(result.assets).toEqual(new Map([[assetId, BigInt('5')]]));
50-
}
51-
);
52-
53-
it('should return provided minimum coin quantity as coins if displayed coins list only has assets', () => {
54-
const result = displayedCoinsTransformer([{ amount: '5', coinId: assetId }], minimumCoinQuantity);
55-
expect(result.coins.toString()).toBe('2500000');
56-
expect(result.assets).toEqual(new Map([[assetId, BigInt('5')]]));
57-
});
58-
});
Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
/* eslint-disable no-magic-numbers */
22
import isEmpty from 'lodash/isEmpty';
3-
import { IAssetInfo, DisplayedCoinDetail } from '../types';
4-
import { Tokens, CardanoTxOutValue, TokensDetails, TxMinimumCoinQuantity } from '../../../types';
3+
import { IAssetInfo } from '../types';
4+
import { Tokens, TokensDetails } from '../../../types';
55
import { Wallet } from '@lace/cardano';
66
import { addEllipsis } from '@lace/common';
77
import { cardanoCoin } from '../../../utils/constants';
8-
import { MIN_COIN_TO_SEND } from '../config';
9-
import BigNumber from 'bignumber.js';
108

119
export const availableCoinsTransformer = (
1210
coins: string,
@@ -31,28 +29,3 @@ export const availableCoinsTransformer = (
3129

3230
return [adaCoin, ...assetList];
3331
};
34-
35-
export const displayedCoinsTransformer = (
36-
displayedCoins: Array<DisplayedCoinDetail>,
37-
minimumCoinQuantity?: TxMinimumCoinQuantity
38-
): CardanoTxOutValue => {
39-
const ada = displayedCoins.find((item) => item.coinId === cardanoCoin.id);
40-
const nonAdaAssets = displayedCoins.filter((item) => item.coinId !== cardanoCoin.id);
41-
42-
const assets =
43-
nonAdaAssets.length > 0
44-
? new Map<Wallet.Cardano.AssetId, bigint>(
45-
nonAdaAssets.map((asset) => [Wallet.Cardano.AssetId(asset.coinId), BigInt(asset.amount)])
46-
)
47-
: undefined;
48-
49-
return {
50-
// The transaction must always have ADA on it,
51-
// if the displayedCoins list does not have ADA we send the minimum coin qty
52-
coins:
53-
ada && new BigNumber(ada.amount).gte(0)
54-
? BigInt(Wallet.util.adaToLovelacesString(ada.amount))
55-
: BigInt(minimumCoinQuantity?.minimumCoin ?? Wallet.util.adaToLovelacesString(MIN_COIN_TO_SEND.toString())),
56-
assets
57-
};
58-
};

apps/browser-extension-wallet/src/features/send/selectors.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,17 @@ export const sendTransactionSelector: StateSelector<SendStore, SendTransactionSl
1111
transactionValue,
1212
transaction,
1313
transactionFeeLovelace,
14-
minimumCoinQuantity,
1514
setDestinationAddress,
1615
setTransactionValue,
1716
setTransaction,
18-
setTransactionFeeLovelace,
19-
setMinimumCoinQuantity
17+
setTransactionFeeLovelace
2018
}) => ({
2119
destinationAddress,
2220
transactionValue,
2321
transaction,
2422
transactionFeeLovelace,
25-
minimumCoinQuantity,
2623
setDestinationAddress,
2724
setTransactionValue,
2825
setTransaction,
29-
setTransactionFeeLovelace,
30-
setMinimumCoinQuantity
26+
setTransactionFeeLovelace
3127
});

apps/browser-extension-wallet/src/features/send/stores/slices/__tests__/send-transaction-slice.test.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,10 @@ describe('Testing send transaction store slice', () => {
2222
expect(result.current.transaction).toBeUndefined();
2323
expect(result.current.transactionValue).toBeUndefined();
2424
expect(result.current.transactionFeeLovelace).toEqual('0');
25-
expect(result.current.minimumCoinQuantity).toEqual({ coinMissing: '0', minimumCoin: '0' });
2625
expect(typeof result.current.setDestinationAddress).toBe('function');
2726
expect(typeof result.current.setTransaction).toBe('function');
2827
expect(typeof result.current.setTransactionValue).toBe('function');
2928
expect(typeof result.current.setTransactionFeeLovelace).toBe('function');
30-
expect(typeof result.current.setMinimumCoinQuantity).toBe('function');
3129
});
3230

3331
test('should be able to set destination address', () => {
@@ -62,13 +60,4 @@ describe('Testing send transaction store slice', () => {
6260

6361
expect(result.current.transactionFeeLovelace).toEqual('2000000');
6462
});
65-
66-
test('should be able to set minimum coin quantity', () => {
67-
const { result } = renderHook(() => useSendTxHook());
68-
act(() => {
69-
result.current.setMinimumCoinQuantity({ coinMissing: '0', minimumCoin: '2000000' });
70-
});
71-
72-
expect(result.current.minimumCoinQuantity).toEqual({ coinMissing: '0', minimumCoin: '2000000' });
73-
});
7463
});

apps/browser-extension-wallet/src/features/send/stores/slices/send-transaction-slice.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@ export const sendTransactionSlice: StateCreator<SendTransactionSlice> = (set) =>
66
destinationAddress: undefined,
77
transactionValue: undefined,
88
transaction: undefined,
9-
minimumCoinQuantity: { coinMissing: '0', minimumCoin: '0' },
109
setDestinationAddress: (address) => set(() => ({ destinationAddress: address })),
1110
setTransactionValue: (value) => set(() => ({ transactionValue: value })),
1211
setTransaction: (tx) => set(() => ({ transaction: tx })),
13-
setTransactionFeeLovelace: (fee) => set(() => ({ transactionFeeLovelace: fee })),
14-
setMinimumCoinQuantity: (coinQty) => set(() => ({ minimumCoinQuantity: coinQty }))
12+
setTransactionFeeLovelace: (fee) => set(() => ({ transactionFeeLovelace: fee }))
1513
});

apps/browser-extension-wallet/src/features/send/stores/types.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { TxMinimumCoinQuantity } from '../../../types';
21
import { CardanoTxBuild, CardanoTxOutAddress, CardanoTxOutValue } from '../../../types/cardano';
32

43
export interface SendCancelModalSlice {
@@ -11,12 +10,10 @@ export interface SendTransactionSlice {
1110
transactionValue: CardanoTxOutValue;
1211
transaction: CardanoTxBuild;
1312
transactionFeeLovelace: string;
14-
minimumCoinQuantity: TxMinimumCoinQuantity;
1513
setDestinationAddress: (address: CardanoTxOutAddress) => void;
1614
setTransactionValue: (value: CardanoTxOutValue) => void;
1715
setTransaction: (tx: CardanoTxBuild) => void;
1816
setTransactionFeeLovelace: (fee: string) => void;
19-
setMinimumCoinQuantity: (coinQty: TxMinimumCoinQuantity) => void;
2017
}
2118

2219
export type SendStore = SendTransactionSlice & SendCancelModalSlice;

packages/cardano/package.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,16 @@
4040
"watch": "yarn build --watch"
4141
},
4242
"dependencies": {
43-
"@cardano-sdk/cardano-services-client": "0.26.18",
44-
"@cardano-sdk/core": "0.46.2",
45-
"@cardano-sdk/crypto": "0.4.1",
46-
"@cardano-sdk/hardware-ledger": "0.16.5",
47-
"@cardano-sdk/hardware-trezor": "0.7.17",
48-
"@cardano-sdk/key-management": "0.29.1",
49-
"@cardano-sdk/tx-construction": "0.27.4",
43+
"@cardano-sdk/cardano-services-client": "0.26.19",
44+
"@cardano-sdk/core": "0.46.3",
45+
"@cardano-sdk/crypto": "0.4.2",
46+
"@cardano-sdk/hardware-ledger": "0.16.7",
47+
"@cardano-sdk/hardware-trezor": "0.7.19",
48+
"@cardano-sdk/key-management": "0.29.2",
49+
"@cardano-sdk/tx-construction": "0.28.0",
5050
"@cardano-sdk/util": "0.17.0",
51-
"@cardano-sdk/wallet": "0.53.5",
52-
"@cardano-sdk/web-extension": "0.39.15",
51+
"@cardano-sdk/wallet": "0.53.7",
52+
"@cardano-sdk/web-extension": "0.39.17",
5353
"@lace/common": "0.1.0",
5454
"@ledgerhq/devices": "^8.4.4",
5555
"@stablelib/chacha20poly1305": "1.0.1",
@@ -73,7 +73,7 @@
7373
},
7474
"devDependencies": {
7575
"@blockfrost/blockfrost-js": "^5.5.0",
76-
"@cardano-sdk/util-dev": "0.25.20",
76+
"@cardano-sdk/util-dev": "0.25.21",
7777
"@emurgo/cardano-message-signing-browser": "1.0.1",
7878
"@types/webextension-polyfill": "0.10.0",
7979
"rollup-plugin-polyfill-node": "^0.8.0",

packages/core/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@
4343
},
4444
"dependencies": {
4545
"@ant-design/icons": "^4.7.0",
46-
"@cardano-sdk/crypto": "0.4.1",
47-
"@cardano-sdk/wallet": "0.53.5",
48-
"@cardano-sdk/web-extension": "0.39.15",
46+
"@cardano-sdk/crypto": "0.4.2",
47+
"@cardano-sdk/wallet": "0.53.7",
48+
"@cardano-sdk/web-extension": "0.39.17",
4949
"@input-output-hk/lace-ui-toolkit": "3.8.0",
5050
"@lace/cardano": "0.1.0",
5151
"@lace/common": "0.1.0",

packages/nami/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@
5757
},
5858
"dependencies": {
5959
"@biglup/is-cid": "^1.0.3",
60-
"@cardano-sdk/core": "0.46.2",
61-
"@cardano-sdk/crypto": "0.4.1",
62-
"@cardano-sdk/tx-construction": "0.27.4",
60+
"@cardano-sdk/core": "0.46.3",
61+
"@cardano-sdk/crypto": "0.4.2",
62+
"@cardano-sdk/tx-construction": "0.28.0",
6363
"@cardano-sdk/util": "0.17.0",
64-
"@cardano-sdk/web-extension": "0.39.15",
64+
"@cardano-sdk/web-extension": "0.39.17",
6565
"@chakra-ui/css-reset": "1.0.0",
6666
"@chakra-ui/icons": "1.0.13",
6767
"@chakra-ui/react": "1.6.4",

packages/staking/package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@
7979
},
8080
"devDependencies": {
8181
"@babel/core": "^7.21.0",
82-
"@cardano-sdk/core": "0.46.2",
83-
"@cardano-sdk/input-selection": "0.14.17",
84-
"@cardano-sdk/tx-construction": "0.27.4",
82+
"@cardano-sdk/core": "0.46.3",
83+
"@cardano-sdk/input-selection": "0.14.18",
84+
"@cardano-sdk/tx-construction": "0.28.0",
8585
"@cardano-sdk/util": "0.17.0",
86-
"@cardano-sdk/wallet": "0.53.5",
87-
"@cardano-sdk/web-extension": "0.39.15",
86+
"@cardano-sdk/wallet": "0.53.7",
87+
"@cardano-sdk/web-extension": "0.39.17",
8888
"@storybook/addon-actions": "^7.6.7",
8989
"@storybook/addon-essentials": "^7.6.7",
9090
"@storybook/addon-interactions": "^7.6.7",
@@ -130,11 +130,11 @@
130130
"wait-on": "^7.0.1"
131131
},
132132
"peerDependencies": {
133-
"@cardano-sdk/input-selection": "0.14.17",
134-
"@cardano-sdk/tx-construction": "0.27.4",
133+
"@cardano-sdk/input-selection": "0.14.18",
134+
"@cardano-sdk/tx-construction": "0.28.0",
135135
"@cardano-sdk/util": "0.17.0",
136-
"@cardano-sdk/wallet": "0.53.5",
137-
"@cardano-sdk/web-extension": "0.39.15",
136+
"@cardano-sdk/wallet": "0.53.7",
137+
"@cardano-sdk/web-extension": "0.39.17",
138138
"@lace/cardano": "^0.1.0",
139139
"@lace/common": "^0.1.0",
140140
"@lace/core": "0.1.0",

0 commit comments

Comments
 (0)