@ledgerhq/live-common 25.2.0-next.0 → 25.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/test-helpers/setup.js +1 -0
- package/lib/__tests__/test-helpers/setup.js.map +1 -1
- package/lib/account/helpers.d.ts.map +1 -1
- package/lib/account/helpers.js +1 -0
- package/lib/account/helpers.js.map +1 -1
- package/lib/account/serialization.d.ts.map +1 -1
- package/lib/account/serialization.js +4 -0
- package/lib/account/serialization.js.map +1 -1
- package/lib/data/icons/react/index.d.ts +1 -0
- package/lib/data/icons/react/index.d.ts.map +1 -1
- package/lib/data/icons/react/index.js +7 -5
- package/lib/data/icons/react/index.js.map +1 -1
- package/lib/data/icons/react/osmo.d.ts +8 -0
- package/lib/data/icons/react/osmo.d.ts.map +1 -0
- package/lib/data/icons/react/osmo.js +39 -0
- package/lib/data/icons/react/osmo.js.map +1 -0
- package/lib/data/icons/reactNative/index.d.ts +1 -0
- package/lib/data/icons/reactNative/index.d.ts.map +1 -1
- package/lib/data/icons/reactNative/index.js +7 -5
- package/lib/data/icons/reactNative/index.js.map +1 -1
- package/lib/data/icons/reactNative/osmo.d.ts +8 -0
- package/lib/data/icons/reactNative/osmo.d.ts.map +1 -0
- package/lib/data/icons/reactNative/osmo.js +40 -0
- package/lib/data/icons/reactNative/osmo.js.map +1 -0
- package/lib/env.d.ts +15 -5
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +10 -0
- package/lib/env.js.map +1 -1
- package/lib/env.react.d.ts +1 -1
- package/lib/env.react.d.ts.map +1 -1
- package/lib/families/cosmos/CosmosValidatorsManager.d.ts +26 -0
- package/lib/families/cosmos/CosmosValidatorsManager.d.ts.map +1 -0
- package/lib/families/cosmos/CosmosValidatorsManager.js +365 -0
- package/lib/families/cosmos/CosmosValidatorsManager.js.map +1 -0
- package/lib/families/cosmos/account.d.ts +2 -2
- package/lib/families/cosmos/account.d.ts.map +1 -1
- package/lib/families/cosmos/account.js +19 -6
- package/lib/families/cosmos/account.js.map +1 -1
- package/lib/families/cosmos/api/Cosmos.d.ts +27 -15
- package/lib/families/cosmos/api/Cosmos.d.ts.map +1 -1
- package/lib/families/cosmos/api/Cosmos.js +418 -410
- package/lib/families/cosmos/api/Cosmos.js.map +1 -1
- package/lib/families/cosmos/bridge/js.d.ts.map +1 -1
- package/lib/families/cosmos/bridge/js.js +5 -5
- package/lib/families/cosmos/bridge/js.js.map +1 -1
- package/lib/families/cosmos/bridge/mock.js +1 -1
- package/lib/families/cosmos/bridge/mock.js.map +1 -1
- package/lib/families/cosmos/bridge.integration.test.js +5 -5
- package/lib/families/cosmos/bridge.integration.test.js.map +1 -1
- package/lib/families/cosmos/cli-transaction.d.ts +3 -3
- package/lib/families/cosmos/cli-transaction.d.ts.map +1 -1
- package/lib/families/cosmos/cli-transaction.js +4 -5
- package/lib/families/cosmos/cli-transaction.js.map +1 -1
- package/lib/families/cosmos/js-buildTransaction.js +3 -3
- package/lib/families/cosmos/js-buildTransaction.js.map +1 -1
- package/lib/families/cosmos/js-createTransaction.js +1 -1
- package/lib/families/cosmos/js-createTransaction.js.map +1 -1
- package/lib/families/cosmos/js-getTransactionStatus.d.ts +17 -3
- package/lib/families/cosmos/js-getTransactionStatus.d.ts.map +1 -1
- package/lib/families/cosmos/js-getTransactionStatus.js +224 -176
- package/lib/families/cosmos/js-getTransactionStatus.js.map +1 -1
- package/lib/families/cosmos/js-prepareTransaction.js +2 -2
- package/lib/families/cosmos/js-prepareTransaction.js.map +1 -1
- package/lib/families/cosmos/js-signOperation.js +3 -3
- package/lib/families/cosmos/js-signOperation.js.map +1 -1
- package/lib/families/cosmos/js-synchronisation.js +2 -2
- package/lib/families/cosmos/js-synchronisation.js.map +1 -1
- package/lib/families/cosmos/logic.js +1 -1
- package/lib/families/cosmos/logic.js.map +1 -1
- package/lib/families/cosmos/mock.js +1 -1
- package/lib/families/cosmos/mock.js.map +1 -1
- package/lib/families/cosmos/react.d.ts +4 -4
- package/lib/families/cosmos/react.d.ts.map +1 -1
- package/lib/families/cosmos/react.js +59 -26
- package/lib/families/cosmos/react.js.map +1 -1
- package/lib/families/cosmos/react.test.js +17 -15
- package/lib/families/cosmos/react.test.js.map +1 -1
- package/lib/families/cosmos/specs.js +2 -2
- package/lib/families/cosmos/specs.js.map +1 -1
- package/lib/families/cosmos/speculos-deviceActions.d.ts.map +1 -1
- package/lib/families/cosmos/speculos-deviceActions.js +1 -1
- package/lib/families/cosmos/speculos-deviceActions.js.map +1 -1
- package/lib/families/cosmos/transaction.d.ts +2 -2
- package/lib/families/cosmos/transaction.d.ts.map +1 -1
- package/lib/families/cosmos/transaction.js +4 -4
- package/lib/families/cosmos/transaction.js.map +1 -1
- package/lib/families/cosmos/types.d.ts +31 -13
- package/lib/families/cosmos/types.d.ts.map +1 -1
- package/lib/families/cosmos/utils.d.ts +1 -0
- package/lib/families/cosmos/utils.d.ts.map +1 -1
- package/lib/families/cosmos/utils.js +7 -1
- package/lib/families/cosmos/utils.js.map +1 -1
- package/lib/families/cosmos/validators.d.ts +3 -5
- package/lib/families/cosmos/validators.d.ts.map +1 -1
- package/lib/families/cosmos/validators.js +4 -317
- package/lib/families/cosmos/validators.js.map +1 -1
- package/lib/families/osmosis/OsmosisSupplyTypes.d.ts +48 -0
- package/lib/families/osmosis/OsmosisSupplyTypes.d.ts.map +1 -0
- package/lib/families/osmosis/OsmosisSupplyTypes.js +3 -0
- package/lib/families/osmosis/OsmosisSupplyTypes.js.map +1 -0
- package/lib/families/osmosis/account.d.ts +14 -0
- package/lib/families/osmosis/account.d.ts.map +1 -0
- package/lib/families/osmosis/account.js +60 -0
- package/lib/families/osmosis/account.js.map +1 -0
- package/lib/families/osmosis/api/sdk.d.ts +35 -0
- package/lib/families/osmosis/api/sdk.d.ts.map +1 -0
- package/lib/families/osmosis/api/sdk.js +478 -0
- package/lib/families/osmosis/api/sdk.js.map +1 -0
- package/lib/families/osmosis/api/sdk.types.d.ts +57 -0
- package/lib/families/osmosis/api/sdk.types.d.ts.map +1 -0
- package/lib/families/osmosis/api/sdk.types.js +15 -0
- package/lib/families/osmosis/api/sdk.types.js.map +1 -0
- package/lib/families/osmosis/api/sdk.unit.test.d.ts +2 -0
- package/lib/families/osmosis/api/sdk.unit.test.d.ts.map +1 -0
- package/lib/families/osmosis/api/sdk.unit.test.js +50 -0
- package/lib/families/osmosis/api/sdk.unit.test.js.map +1 -0
- package/lib/families/osmosis/bridge/js.d.ts +8 -0
- package/lib/families/osmosis/bridge/js.d.ts.map +1 -0
- package/lib/families/osmosis/bridge/js.js +98 -0
- package/lib/families/osmosis/bridge/js.js.map +1 -0
- package/lib/families/osmosis/bridge.integration.test.d.ts +2 -0
- package/lib/families/osmosis/bridge.integration.test.d.ts.map +1 -0
- package/lib/families/osmosis/bridge.integration.test.js +383 -0
- package/lib/families/osmosis/bridge.integration.test.js.map +1 -0
- package/lib/families/osmosis/cli-transaction.d.ts +38 -0
- package/lib/families/osmosis/cli-transaction.d.ts.map +1 -0
- package/lib/families/osmosis/cli-transaction.js +119 -0
- package/lib/families/osmosis/cli-transaction.js.map +1 -0
- package/lib/families/osmosis/deviceTransactionConfig.d.ts +25 -0
- package/lib/families/osmosis/deviceTransactionConfig.d.ts.map +1 -0
- package/lib/families/osmosis/deviceTransactionConfig.js +132 -0
- package/lib/families/osmosis/deviceTransactionConfig.js.map +1 -0
- package/lib/families/osmosis/errors.d.ts +4 -0
- package/lib/families/osmosis/errors.d.ts.map +1 -0
- package/lib/families/osmosis/errors.js +8 -0
- package/lib/families/osmosis/errors.js.map +1 -0
- package/lib/families/osmosis/hw-getAddress.d.ts +4 -0
- package/lib/families/osmosis/hw-getAddress.d.ts.map +1 -0
- package/lib/families/osmosis/hw-getAddress.js +64 -0
- package/lib/families/osmosis/hw-getAddress.js.map +1 -0
- package/lib/families/osmosis/js-buildTransaction.d.ts +14 -0
- package/lib/families/osmosis/js-buildTransaction.d.ts.map +1 -0
- package/lib/families/osmosis/js-buildTransaction.js +303 -0
- package/lib/families/osmosis/js-buildTransaction.js.map +1 -0
- package/lib/families/osmosis/js-estimateMaxSpendable.d.ts +15 -0
- package/lib/families/osmosis/js-estimateMaxSpendable.d.ts.map +1 -0
- package/lib/families/osmosis/js-estimateMaxSpendable.js +67 -0
- package/lib/families/osmosis/js-estimateMaxSpendable.js.map +1 -0
- package/lib/families/osmosis/js-getFeesForTransaction.d.ts +15 -0
- package/lib/families/osmosis/js-getFeesForTransaction.d.ts.map +1 -0
- package/lib/families/osmosis/js-getFeesForTransaction.js +85 -0
- package/lib/families/osmosis/js-getFeesForTransaction.js.map +1 -0
- package/lib/families/osmosis/js-getTransactionStatus.d.ts +3 -0
- package/lib/families/osmosis/js-getTransactionStatus.d.ts.map +1 -0
- package/lib/families/osmosis/js-getTransactionStatus.js +10 -0
- package/lib/families/osmosis/js-getTransactionStatus.js.map +1 -0
- package/lib/families/osmosis/js-signOperation.d.ts +10 -0
- package/lib/families/osmosis/js-signOperation.d.ts.map +1 -0
- package/lib/families/osmosis/js-signOperation.js +211 -0
- package/lib/families/osmosis/js-signOperation.js.map +1 -0
- package/lib/families/osmosis/js-synchronization.d.ts +9 -0
- package/lib/families/osmosis/js-synchronization.d.ts.map +1 -0
- package/lib/families/osmosis/js-synchronization.js +176 -0
- package/lib/families/osmosis/js-synchronization.js.map +1 -0
- package/lib/families/osmosis/js-transaction.d.ts +23 -0
- package/lib/families/osmosis/js-transaction.d.ts.map +1 -0
- package/lib/families/osmosis/js-transaction.js +177 -0
- package/lib/families/osmosis/js-transaction.js.map +1 -0
- package/lib/families/osmosis/logic.d.ts +5 -0
- package/lib/families/osmosis/logic.d.ts.map +1 -0
- package/lib/families/osmosis/logic.js +22 -0
- package/lib/families/osmosis/logic.js.map +1 -0
- package/lib/families/osmosis/preloadedData.d.ts +9 -0
- package/lib/families/osmosis/preloadedData.d.ts.map +1 -0
- package/lib/families/osmosis/preloadedData.js +32 -0
- package/lib/families/osmosis/preloadedData.js.map +1 -0
- package/lib/families/osmosis/serialization.d.ts +7 -0
- package/lib/families/osmosis/serialization.d.ts.map +1 -0
- package/lib/families/osmosis/serialization.js +5 -0
- package/lib/families/osmosis/serialization.js.map +1 -0
- package/lib/families/osmosis/specs.d.ts +7 -0
- package/lib/families/osmosis/specs.d.ts.map +1 -0
- package/lib/families/osmosis/specs.js +402 -0
- package/lib/families/osmosis/specs.js.map +1 -0
- package/lib/families/osmosis/speculos-deviceActions.d.ts +7 -0
- package/lib/families/osmosis/speculos-deviceActions.d.ts.map +1 -0
- package/lib/families/osmosis/speculos-deviceActions.js +120 -0
- package/lib/families/osmosis/speculos-deviceActions.js.map +1 -0
- package/lib/families/osmosis/transaction.d.ts +10 -0
- package/lib/families/osmosis/transaction.d.ts.map +1 -0
- package/lib/families/osmosis/transaction.js +13 -0
- package/lib/families/osmosis/transaction.js.map +1 -0
- package/lib/families/osmosis/types.d.ts +38 -0
- package/lib/families/osmosis/types.d.ts.map +1 -0
- package/lib/families/osmosis/types.js +3 -0
- package/lib/families/osmosis/types.js.map +1 -0
- package/lib/families/osmosis/utils.d.ts +8 -0
- package/lib/families/osmosis/utils.d.ts.map +1 -0
- package/lib/families/osmosis/utils.js +28 -0
- package/lib/families/osmosis/utils.js.map +1 -0
- package/lib/families/osmosis/validators.d.ts +4 -0
- package/lib/families/osmosis/validators.d.ts.map +1 -0
- package/lib/families/osmosis/validators.js +131 -0
- package/lib/families/osmosis/validators.js.map +1 -0
- package/lib/featureFlags/defaultFeatures.d.ts.map +1 -1
- package/lib/featureFlags/defaultFeatures.js +3 -0
- package/lib/featureFlags/defaultFeatures.js.map +1 -1
- package/lib/generated/account.d.ts +7 -1
- package/lib/generated/account.d.ts.map +1 -1
- package/lib/generated/account.js +4 -2
- package/lib/generated/account.js.map +1 -1
- package/lib/generated/bridge/js.d.ts +4 -0
- package/lib/generated/bridge/js.d.ts.map +1 -1
- package/lib/generated/bridge/js.js +14 -12
- package/lib/generated/bridge/js.js.map +1 -1
- package/lib/generated/cli-transaction.d.ts +33 -2
- package/lib/generated/cli-transaction.d.ts.map +1 -1
- package/lib/generated/cli-transaction.js +14 -12
- package/lib/generated/cli-transaction.js.map +1 -1
- package/lib/generated/deviceTransactionConfig.d.ts +4 -1
- package/lib/generated/deviceTransactionConfig.d.ts.map +1 -1
- package/lib/generated/deviceTransactionConfig.js +14 -12
- package/lib/generated/deviceTransactionConfig.js.map +1 -1
- package/lib/generated/hw-getAddress.d.ts +1 -0
- package/lib/generated/hw-getAddress.d.ts.map +1 -1
- package/lib/generated/hw-getAddress.js +14 -12
- package/lib/generated/hw-getAddress.js.map +1 -1
- package/lib/generated/specs.d.ts +3 -0
- package/lib/generated/specs.d.ts.map +1 -1
- package/lib/generated/specs.js +14 -12
- package/lib/generated/specs.js.map +1 -1
- package/lib/generated/speculos-deviceActions.d.ts +3 -0
- package/lib/generated/speculos-deviceActions.d.ts.map +1 -1
- package/lib/generated/speculos-deviceActions.js +14 -12
- package/lib/generated/speculos-deviceActions.js.map +1 -1
- package/lib/generated/transaction.d.ts +9 -1
- package/lib/generated/transaction.d.ts.map +1 -1
- package/lib/generated/transaction.js +14 -12
- package/lib/generated/transaction.js.map +1 -1
- package/lib/generated/types.d.ts +8 -4
- package/lib/generated/types.d.ts.map +1 -1
- package/lib/reconciliation.d.ts.map +1 -1
- package/lib/reconciliation.js +9 -0
- package/lib/reconciliation.js.map +1 -1
- package/package.json +8 -3
- package/src/__tests__/test-helpers/setup.ts +1 -0
- package/src/account/helpers.ts +1 -0
- package/src/account/serialization.ts +6 -0
- package/src/data/icons/react/index.tsx +1 -0
- package/src/data/icons/react/osmo.tsx +14 -0
- package/src/data/icons/reactNative/index.tsx +1 -0
- package/src/data/icons/reactNative/osmo.tsx +15 -0
- package/src/data/icons/svg/OSMO.svg +7 -0
- package/src/env.ts +10 -0
- package/src/families/cosmos/CosmosValidatorsManager.ts +420 -0
- package/src/families/cosmos/account.ts +29 -10
- package/src/families/cosmos/api/Cosmos.ts +267 -257
- package/src/families/cosmos/bridge/js.ts +6 -7
- package/src/families/cosmos/bridge/mock.ts +1 -1
- package/src/families/cosmos/bridge.integration.test.ts +5 -5
- package/src/families/cosmos/cli-transaction.ts +7 -8
- package/src/families/cosmos/js-buildTransaction.ts +4 -4
- package/src/families/cosmos/js-createTransaction.ts +1 -1
- package/src/families/cosmos/js-getTransactionStatus.ts +276 -226
- package/src/families/cosmos/js-prepareTransaction.ts +3 -3
- package/src/families/cosmos/js-signOperation.ts +4 -4
- package/src/families/cosmos/js-synchronisation.ts +3 -3
- package/src/families/cosmos/logic.ts +1 -1
- package/src/families/cosmos/mock.ts +1 -1
- package/src/families/cosmos/react.test.ts +25 -14
- package/src/families/cosmos/react.ts +73 -21
- package/src/families/cosmos/specs.ts +2 -2
- package/src/families/cosmos/speculos-deviceActions.ts +1 -2
- package/src/families/cosmos/transaction.ts +4 -6
- package/src/families/cosmos/types.ts +41 -13
- package/src/families/cosmos/utils.ts +8 -0
- package/src/families/cosmos/validators.ts +5 -363
- package/src/families/osmosis/OsmosisSupplyTypes.ts +53 -0
- package/src/families/osmosis/__snapshots__/bridge.integration.test.ts.snap +852 -0
- package/src/families/osmosis/account.ts +65 -0
- package/src/families/osmosis/api/sdk.ts +530 -0
- package/src/families/osmosis/api/sdk.types.ts +65 -0
- package/src/families/osmosis/api/sdk.unit.test.ts +70 -0
- package/src/families/osmosis/bridge/js.ts +64 -0
- package/src/families/osmosis/bridge.integration.test.ts +467 -0
- package/src/families/osmosis/cli-transaction.ts +145 -0
- package/src/families/osmosis/deviceTransactionConfig.ts +174 -0
- package/src/families/osmosis/errors.ts +13 -0
- package/src/families/osmosis/hw-getAddress.ts +14 -0
- package/src/families/osmosis/js-buildTransaction.ts +306 -0
- package/src/families/osmosis/js-estimateMaxSpendable.ts +26 -0
- package/src/families/osmosis/js-getFeesForTransaction.ts +44 -0
- package/src/families/osmosis/js-getTransactionStatus.ts +9 -0
- package/src/families/osmosis/js-signOperation.ts +172 -0
- package/src/families/osmosis/js-synchronization.ts +122 -0
- package/src/families/osmosis/js-transaction.ts +96 -0
- package/src/families/osmosis/logic.ts +26 -0
- package/src/families/osmosis/preloadedData.ts +32 -0
- package/src/families/osmosis/serialization.ts +6 -0
- package/src/families/osmosis/specs.ts +393 -0
- package/src/families/osmosis/speculos-deviceActions.ts +94 -0
- package/src/families/osmosis/transaction.ts +20 -0
- package/src/families/osmosis/types.ts +48 -0
- package/src/families/osmosis/utils.ts +31 -0
- package/src/families/osmosis/validators.ts +79 -0
- package/src/featureFlags/defaultFeatures.ts +3 -0
- package/src/generated/account.ts +3 -0
- package/src/generated/bridge/js.ts +3 -0
- package/src/generated/cli-transaction.ts +3 -0
- package/src/generated/deviceTransactionConfig.ts +5 -0
- package/src/generated/hw-getAddress.ts +3 -0
- package/src/generated/specs.ts +3 -0
- package/src/generated/speculos-deviceActions.ts +3 -0
- package/src/generated/transaction.ts +3 -0
- package/src/generated/types.ts +8 -0
- package/src/reconciliation.ts +16 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { BigNumber } from "bignumber.js";
|
|
2
|
+
import { CosmosOperationMode } from "../cosmos/types";
|
|
3
|
+
|
|
4
|
+
const gasForTransaction: {
|
|
5
|
+
[Key in CosmosOperationMode]: number;
|
|
6
|
+
} = {
|
|
7
|
+
send: 100000,
|
|
8
|
+
delegate: 300000,
|
|
9
|
+
undelegate: 350000,
|
|
10
|
+
redelegate: 550000,
|
|
11
|
+
claimReward: 300000,
|
|
12
|
+
claimRewardCompound: 400000,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// Default fees in uosmo
|
|
16
|
+
// Dear future developer working on this file, if fees become non-zero
|
|
17
|
+
// make sure to flip estimatedFees.isZero() to !estimatedFees.isZero() in
|
|
18
|
+
// './deviceTransactionConfig.ts'.
|
|
19
|
+
export const DEFAULT_FEES = 0;
|
|
20
|
+
export const MIN_GAS_FEE = 0.0025; // Min gas fee in uosmo (https://commonwealth.im/osmosis/discussion/6298-draft-minimum-gas-fee)
|
|
21
|
+
export const DEFAULT_GAS = 100000;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Fetch the transaction fees for a transaction
|
|
25
|
+
*/
|
|
26
|
+
const getEstimatedFees = async (mode: string): Promise<BigNumber> => {
|
|
27
|
+
const gas = await getEstimatedGas(mode as CosmosOperationMode);
|
|
28
|
+
return gas.times(MIN_GAS_FEE);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Fetch the gas for a transaction
|
|
33
|
+
*/
|
|
34
|
+
export const getEstimatedGas = async (
|
|
35
|
+
mode: CosmosOperationMode
|
|
36
|
+
): Promise<BigNumber> => {
|
|
37
|
+
const estimatedGas = gasForTransaction[mode];
|
|
38
|
+
if (!estimatedGas) {
|
|
39
|
+
return new BigNumber(DEFAULT_GAS);
|
|
40
|
+
}
|
|
41
|
+
return new BigNumber(estimatedGas);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export default getEstimatedFees;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CosmosTransactionStatusManager } from "../cosmos/js-getTransactionStatus";
|
|
2
|
+
import { osmosisAPI } from "./api/sdk";
|
|
3
|
+
|
|
4
|
+
const osmosisTransactionStatusManager = new CosmosTransactionStatusManager({
|
|
5
|
+
api: osmosisAPI,
|
|
6
|
+
validatorOperatorAddressPrefix: "osmovaloper",
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
export default osmosisTransactionStatusManager.getTransactionStatus;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Account,
|
|
3
|
+
DeviceId,
|
|
4
|
+
Operation,
|
|
5
|
+
OperationType,
|
|
6
|
+
SignOperationEvent,
|
|
7
|
+
} from "@ledgerhq/types-live";
|
|
8
|
+
import type { Transaction } from "./types";
|
|
9
|
+
import { osmosisAPI } from "./api/sdk";
|
|
10
|
+
import { Observable } from "rxjs";
|
|
11
|
+
import { withDevice } from "../../hw/deviceAccess";
|
|
12
|
+
import { encodeOperationId } from "../../operation";
|
|
13
|
+
import { LedgerSigner } from "@cosmjs/ledger-amino";
|
|
14
|
+
import { HdPath, stringToPath } from "@cosmjs/crypto";
|
|
15
|
+
import { buildTransaction, postBuildTransaction } from "./js-buildTransaction";
|
|
16
|
+
import BigNumber from "bignumber.js";
|
|
17
|
+
import { makeSignDoc } from "@cosmjs/launchpad";
|
|
18
|
+
import getEstimatedFees, {
|
|
19
|
+
DEFAULT_FEES,
|
|
20
|
+
getEstimatedGas,
|
|
21
|
+
} from "./js-getFeesForTransaction";
|
|
22
|
+
|
|
23
|
+
const signOperation = ({
|
|
24
|
+
account,
|
|
25
|
+
deviceId,
|
|
26
|
+
transaction,
|
|
27
|
+
}: {
|
|
28
|
+
account: Account;
|
|
29
|
+
deviceId: DeviceId;
|
|
30
|
+
transaction: Transaction;
|
|
31
|
+
}): Observable<SignOperationEvent> =>
|
|
32
|
+
withDevice(deviceId)((transport) =>
|
|
33
|
+
Observable.create((o) => {
|
|
34
|
+
let cancelled;
|
|
35
|
+
|
|
36
|
+
async function main() {
|
|
37
|
+
const { accountNumber, sequence } = await osmosisAPI.getAccount(
|
|
38
|
+
account.freshAddress
|
|
39
|
+
);
|
|
40
|
+
const chainId = await osmosisAPI.getChainId();
|
|
41
|
+
const hdPaths: HdPath = stringToPath("m/" + account.freshAddressPath);
|
|
42
|
+
const ledgerSigner = new LedgerSigner(transport, {
|
|
43
|
+
hdPaths: [hdPaths],
|
|
44
|
+
prefix: account.currency.id,
|
|
45
|
+
});
|
|
46
|
+
o.next({ type: "device-signature-requested" });
|
|
47
|
+
|
|
48
|
+
const { aminoMsgs, protoMsgs } = await buildTransaction(
|
|
49
|
+
account,
|
|
50
|
+
transaction
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
if (aminoMsgs.length === 0 || protoMsgs.length === 0) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const feeToEncode = {
|
|
58
|
+
amount: [
|
|
59
|
+
{
|
|
60
|
+
denom: account.currency.units[1].code,
|
|
61
|
+
amount: transaction.fees
|
|
62
|
+
? (transaction.fees.toNumber().toString() as string)
|
|
63
|
+
: (String(await getEstimatedFees(transaction.mode)) as string),
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
gas: transaction.gas
|
|
67
|
+
? (transaction.gas.toString() as string)
|
|
68
|
+
: (String(await getEstimatedGas(transaction.mode)) as string),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const signDoc = makeSignDoc(
|
|
72
|
+
aminoMsgs,
|
|
73
|
+
feeToEncode,
|
|
74
|
+
chainId,
|
|
75
|
+
transaction.memo || "",
|
|
76
|
+
accountNumber.toString(),
|
|
77
|
+
sequence.toString()
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const signResponse = await ledgerSigner.signAmino(
|
|
81
|
+
account.freshAddress,
|
|
82
|
+
signDoc
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const signed_tx_bytes = await postBuildTransaction(
|
|
86
|
+
signResponse,
|
|
87
|
+
protoMsgs
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const signature = Buffer.from(signed_tx_bytes).toString("hex");
|
|
91
|
+
|
|
92
|
+
if (cancelled) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
o.next({ type: "device-signature-granted" });
|
|
97
|
+
|
|
98
|
+
const hash = ""; // resolved at broadcast time
|
|
99
|
+
const accountId = account.id;
|
|
100
|
+
|
|
101
|
+
const fee = transaction.fees || new BigNumber(DEFAULT_FEES);
|
|
102
|
+
const extra = { memo: transaction.memo || {} };
|
|
103
|
+
const type: OperationType =
|
|
104
|
+
transaction.mode === "undelegate"
|
|
105
|
+
? "UNDELEGATE"
|
|
106
|
+
: transaction.mode === "delegate"
|
|
107
|
+
? "DELEGATE"
|
|
108
|
+
: transaction.mode === "redelegate"
|
|
109
|
+
? "REDELEGATE"
|
|
110
|
+
: ["claimReward", "claimRewardCompound"].includes(transaction.mode)
|
|
111
|
+
? "REWARD"
|
|
112
|
+
: "OUT";
|
|
113
|
+
|
|
114
|
+
const senders: string[] = [];
|
|
115
|
+
const recipients: string[] = [];
|
|
116
|
+
|
|
117
|
+
if (transaction.mode === "send") {
|
|
118
|
+
senders.push(account.freshAddress);
|
|
119
|
+
recipients.push(transaction.recipient);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (transaction.mode === "redelegate") {
|
|
123
|
+
Object.assign(extra, {
|
|
124
|
+
sourceValidator: transaction.sourceValidator,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (transaction.mode !== "send") {
|
|
129
|
+
Object.assign(extra, {
|
|
130
|
+
validators: transaction.validators,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// build optimistic operation
|
|
135
|
+
const operation: Operation = {
|
|
136
|
+
id: encodeOperationId(accountId, hash, type),
|
|
137
|
+
hash,
|
|
138
|
+
type,
|
|
139
|
+
value: transaction.amount, // Note: prepareTransaction already takes care of setting the correct tx amount (w/ fees) if useAllAmount is selected
|
|
140
|
+
fee,
|
|
141
|
+
extra,
|
|
142
|
+
blockHash: null,
|
|
143
|
+
blockHeight: null,
|
|
144
|
+
senders,
|
|
145
|
+
recipients,
|
|
146
|
+
accountId,
|
|
147
|
+
date: new Date(),
|
|
148
|
+
transactionSequenceNumber: sequence,
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
o.next({
|
|
152
|
+
type: "signed",
|
|
153
|
+
signedOperation: {
|
|
154
|
+
operation,
|
|
155
|
+
signature,
|
|
156
|
+
expirationDate: null,
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
main().then(
|
|
162
|
+
() => o.complete(),
|
|
163
|
+
(e) => o.error(e)
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
return () => {
|
|
167
|
+
cancelled = true;
|
|
168
|
+
};
|
|
169
|
+
})
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
export default signOperation;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { pubkeyToAddress, decodeBech32Pubkey } from "@cosmjs/amino";
|
|
2
|
+
import { BigNumber } from "bignumber.js";
|
|
3
|
+
import { encodeAccountId } from "../../account";
|
|
4
|
+
import {
|
|
5
|
+
makeSync,
|
|
6
|
+
makeScanAccounts,
|
|
7
|
+
GetAccountShape,
|
|
8
|
+
mergeOps,
|
|
9
|
+
} from "../../bridge/jsHelpers";
|
|
10
|
+
import { osmosisAPI } from "./api/sdk";
|
|
11
|
+
|
|
12
|
+
const accountPubPrefix = "osmopub";
|
|
13
|
+
const accountAddressPrefix = "osmo";
|
|
14
|
+
|
|
15
|
+
const getAccountShape: GetAccountShape = async (info) => {
|
|
16
|
+
const { address, currency, derivationMode, initialAccount } = info;
|
|
17
|
+
let xpubOrAddress = address;
|
|
18
|
+
|
|
19
|
+
if (address.match(accountPubPrefix)) {
|
|
20
|
+
const pubkey = decodeBech32Pubkey(address);
|
|
21
|
+
xpubOrAddress = pubkeyToAddress(pubkey as any, accountAddressPrefix);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const accountId = encodeAccountId({
|
|
25
|
+
type: "js",
|
|
26
|
+
version: "2",
|
|
27
|
+
currencyId: currency.id,
|
|
28
|
+
xpubOrAddress,
|
|
29
|
+
derivationMode,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const {
|
|
33
|
+
balances,
|
|
34
|
+
blockHeight,
|
|
35
|
+
delegations,
|
|
36
|
+
redelegations,
|
|
37
|
+
unbondings,
|
|
38
|
+
withdrawAddress,
|
|
39
|
+
} = await osmosisAPI.getAccountInfo(xpubOrAddress, currency);
|
|
40
|
+
|
|
41
|
+
const oldOperations = initialAccount?.operations || [];
|
|
42
|
+
|
|
43
|
+
let operations = oldOperations;
|
|
44
|
+
|
|
45
|
+
// For indexer efficiency reasons, only fetch new operations starting from the datetime
|
|
46
|
+
// of the last operation previously fetched
|
|
47
|
+
let lastOperationDate: Date | null = null;
|
|
48
|
+
if (operations.length > 0) {
|
|
49
|
+
operations.forEach((o) => {
|
|
50
|
+
if (o.date != null) {
|
|
51
|
+
if (lastOperationDate !== null) {
|
|
52
|
+
if (o.date.valueOf() > lastOperationDate.valueOf()) {
|
|
53
|
+
lastOperationDate = o.date;
|
|
54
|
+
}
|
|
55
|
+
} else {
|
|
56
|
+
lastOperationDate = o.date;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const newOperations = await osmosisAPI.getOperations(
|
|
63
|
+
accountId,
|
|
64
|
+
address,
|
|
65
|
+
lastOperationDate
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
// Merge new operations with the previously synced ones
|
|
69
|
+
operations = mergeOps(operations, newOperations);
|
|
70
|
+
|
|
71
|
+
let balance = balances;
|
|
72
|
+
let delegatedBalance = new BigNumber(0);
|
|
73
|
+
let pendingRewardsBalance = new BigNumber(0);
|
|
74
|
+
let unbondingBalance = new BigNumber(0);
|
|
75
|
+
|
|
76
|
+
for (const delegation of delegations) {
|
|
77
|
+
delegatedBalance = delegatedBalance.plus(delegation.amount);
|
|
78
|
+
balance = balance.plus(delegation.amount);
|
|
79
|
+
|
|
80
|
+
pendingRewardsBalance = pendingRewardsBalance.plus(
|
|
81
|
+
delegation.pendingRewards
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (const unbonding of unbondings) {
|
|
86
|
+
unbondingBalance = unbondingBalance.plus(unbonding.amount);
|
|
87
|
+
balance = balance.plus(unbonding.amount);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let spendableBalance = balance.minus(unbondingBalance.plus(delegatedBalance));
|
|
91
|
+
|
|
92
|
+
if (spendableBalance.lt(0)) {
|
|
93
|
+
spendableBalance = new BigNumber(0);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const shape = {
|
|
97
|
+
id: accountId,
|
|
98
|
+
xpub: xpubOrAddress,
|
|
99
|
+
balance: balance,
|
|
100
|
+
spendableBalance,
|
|
101
|
+
operationsCount: operations.length,
|
|
102
|
+
blockHeight,
|
|
103
|
+
cosmosResources: {
|
|
104
|
+
delegations,
|
|
105
|
+
redelegations,
|
|
106
|
+
unbondings,
|
|
107
|
+
delegatedBalance,
|
|
108
|
+
pendingRewardsBalance,
|
|
109
|
+
unbondingBalance,
|
|
110
|
+
withdrawAddress,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
if (shape.spendableBalance && shape.spendableBalance.lt(0)) {
|
|
115
|
+
shape.spendableBalance = new BigNumber(0);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return { ...shape, operations };
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export const scanAccounts = makeScanAccounts({ getAccountShape });
|
|
122
|
+
export const sync = makeSync({ getAccountShape });
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { BigNumber } from "bignumber.js";
|
|
2
|
+
import type { Account } from "@ledgerhq/types-live";
|
|
3
|
+
import type { Transaction } from "./types";
|
|
4
|
+
import getEstimatedFees, { getEstimatedGas } from "./js-getFeesForTransaction";
|
|
5
|
+
import estimateMaxSpendable from "./js-estimateMaxSpendable";
|
|
6
|
+
import { CosmosDelegationInfo } from "../cosmos/types";
|
|
7
|
+
|
|
8
|
+
const sameFees = (a, b) => (!a || !b ? a === b : a.eq(b));
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Create an empty transaction
|
|
12
|
+
*
|
|
13
|
+
* @returns {Transaction}
|
|
14
|
+
*/
|
|
15
|
+
export const createTransaction = (): Transaction => ({
|
|
16
|
+
family: "osmosis",
|
|
17
|
+
mode: "send",
|
|
18
|
+
amount: new BigNumber(0),
|
|
19
|
+
recipient: "",
|
|
20
|
+
useAllAmount: false,
|
|
21
|
+
fees: null,
|
|
22
|
+
gas: null,
|
|
23
|
+
memo: null,
|
|
24
|
+
validators: [] as CosmosDelegationInfo[],
|
|
25
|
+
sourceValidator: null,
|
|
26
|
+
networkInfo: {
|
|
27
|
+
family: "osmosis",
|
|
28
|
+
fees: new BigNumber(0),
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Apply patch to transaction
|
|
34
|
+
*
|
|
35
|
+
* @param {*} t
|
|
36
|
+
* @param {*} patch
|
|
37
|
+
*/
|
|
38
|
+
export const updateTransaction = (
|
|
39
|
+
t: Transaction,
|
|
40
|
+
patch: Partial<Transaction>
|
|
41
|
+
): Transaction => {
|
|
42
|
+
if ("mode" in patch && patch.mode !== t.mode) {
|
|
43
|
+
return { ...t, ...patch, gas: null, fees: null };
|
|
44
|
+
}
|
|
45
|
+
if (
|
|
46
|
+
"validators" in patch &&
|
|
47
|
+
patch.validators?.length !== t.validators.length
|
|
48
|
+
) {
|
|
49
|
+
return { ...t, ...patch, gas: null, fees: null };
|
|
50
|
+
}
|
|
51
|
+
return { ...t, ...patch };
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Prepare transaction before checking status
|
|
56
|
+
*
|
|
57
|
+
* @param {Account} a
|
|
58
|
+
* @param {Transaction} t
|
|
59
|
+
*/
|
|
60
|
+
export const prepareTransaction = async (account: Account, t: Transaction) => {
|
|
61
|
+
let { fees, memo, gas, amount } = t;
|
|
62
|
+
const { mode } = t;
|
|
63
|
+
|
|
64
|
+
fees = await getEstimatedFees(mode);
|
|
65
|
+
gas = await getEstimatedGas(mode);
|
|
66
|
+
|
|
67
|
+
if (mode === "send") {
|
|
68
|
+
t.amount = t.useAllAmount
|
|
69
|
+
? await estimateMaxSpendable({ account, parentAccount: null, mode })
|
|
70
|
+
: amount;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (mode !== "send" && !memo) {
|
|
74
|
+
memo = "Ledger Live";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (t.useAllAmount) {
|
|
78
|
+
amount = await estimateMaxSpendable({ account, parentAccount: null, mode });
|
|
79
|
+
t = { ...t, amount, fees, gas };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if ((mode === "delegate" || mode === "claimRewardCompound") && amount.eq(0)) {
|
|
83
|
+
const validatorAmount = t.validators.reduce(
|
|
84
|
+
(old, current) => old.plus(current.amount),
|
|
85
|
+
new BigNumber(0)
|
|
86
|
+
);
|
|
87
|
+
amount = validatorAmount;
|
|
88
|
+
t = { ...t, amount, fees, gas };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (t.memo !== memo || !sameFees(t.fees, fees)) {
|
|
92
|
+
return { ...t, memo, fees, gas };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return t;
|
|
96
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Account } from "@ledgerhq/types-live";
|
|
2
|
+
import { BigNumber } from "bignumber.js";
|
|
3
|
+
import { COSMOS_MAX_DELEGATIONS } from "../cosmos/logic";
|
|
4
|
+
import { DEFAULT_GAS, MIN_GAS_FEE } from "./js-getFeesForTransaction";
|
|
5
|
+
|
|
6
|
+
const OSMOSIS_MIN_SAFE = new BigNumber(10000); // 10000 uosmo, setting a reasonable floor
|
|
7
|
+
const OSMOSIS_MIN_FEES = new BigNumber(MIN_GAS_FEE * DEFAULT_GAS);
|
|
8
|
+
|
|
9
|
+
export function canDelegate(account: Account): boolean {
|
|
10
|
+
const maxSpendableBalance = getMaxDelegationAvailable(account, 1);
|
|
11
|
+
return maxSpendableBalance.gt(0);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function getMaxDelegationAvailable(
|
|
15
|
+
account: Account,
|
|
16
|
+
validatorsLength: number
|
|
17
|
+
): BigNumber {
|
|
18
|
+
const numberOfDelegations = Math.min(
|
|
19
|
+
COSMOS_MAX_DELEGATIONS,
|
|
20
|
+
validatorsLength || 1
|
|
21
|
+
);
|
|
22
|
+
const { spendableBalance } = account;
|
|
23
|
+
return spendableBalance
|
|
24
|
+
.minus(OSMOSIS_MIN_FEES.multipliedBy(numberOfDelegations))
|
|
25
|
+
.minus(OSMOSIS_MIN_SAFE);
|
|
26
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Observable, Subject } from "rxjs";
|
|
2
|
+
import type { CosmosPreloadData, CosmosValidatorItem } from "../cosmos/types";
|
|
3
|
+
import { asSafeCosmosPreloadData } from "../cosmos/preloadedData";
|
|
4
|
+
|
|
5
|
+
// this module holds the cached state of preload()
|
|
6
|
+
// eslint-disable-next-line no-unused-vars
|
|
7
|
+
let currentOsmosisPreloadedData: CosmosPreloadData = {
|
|
8
|
+
// NB initial state because UI need to work even if it's currently "loading", typically after clear cache
|
|
9
|
+
validators: [],
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const updates = new Subject<CosmosPreloadData>();
|
|
13
|
+
|
|
14
|
+
export function setOsmosisPreloadData(data: CosmosPreloadData): void {
|
|
15
|
+
if (data === currentOsmosisPreloadedData) return;
|
|
16
|
+
currentOsmosisPreloadedData = data;
|
|
17
|
+
updates.next(data);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function getCurrentOsmosisPreloadData(): CosmosPreloadData {
|
|
21
|
+
return currentOsmosisPreloadedData;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function getOsmosisPreloadDataUpdates(): Observable<CosmosPreloadData> {
|
|
25
|
+
return updates.asObservable();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function asSafeOsmosisPreloadData(data?: {
|
|
29
|
+
validators?: CosmosValidatorItem[];
|
|
30
|
+
}): CosmosPreloadData {
|
|
31
|
+
return asSafeCosmosPreloadData(data);
|
|
32
|
+
}
|