@ledgerhq/live-common 21.29.0 → 21.32.0
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/bridge.js +1 -1
- package/lib/__tests__/test-helpers/bridge.js.map +1 -1
- package/lib/__tests__/test-helpers/setup.js +1 -0
- package/lib/__tests__/test-helpers/setup.js.map +1 -1
- package/lib/account/support.d.ts.map +1 -1
- package/lib/account/support.js.map +1 -1
- package/lib/apps/hw.d.ts.map +1 -1
- package/lib/apps/hw.js +8 -3
- package/lib/apps/hw.js.map +1 -1
- package/lib/bot/engine.js +1 -1
- package/lib/bot/engine.js.map +1 -1
- package/lib/bridge/jsHelpers.js +1 -1
- package/lib/data/icons/react/celo.d.ts +8 -0
- package/lib/data/icons/react/celo.d.ts.map +1 -0
- package/lib/data/icons/react/celo.js +32 -0
- package/lib/data/icons/react/celo.js.map +1 -0
- 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 +11 -8
- package/lib/data/icons/react/index.js.map +1 -1
- package/lib/data/icons/reactNative/celo.d.ts +8 -0
- package/lib/data/icons/reactNative/celo.d.ts.map +1 -0
- package/lib/data/icons/reactNative/celo.js +33 -0
- package/lib/data/icons/reactNative/celo.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 +11 -8
- package/lib/data/icons/reactNative/index.js.map +1 -1
- package/lib/env.d.ts +20 -5
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +15 -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/celo/api/hubble.d.ts +8 -0
- package/lib/families/celo/api/hubble.d.ts.map +1 -0
- package/lib/families/celo/api/hubble.js +144 -0
- package/lib/families/celo/api/hubble.js.map +1 -0
- package/lib/families/celo/api/index.d.ts +2 -0
- package/lib/families/celo/api/index.d.ts.map +1 -0
- package/lib/families/celo/api/index.js +13 -0
- package/lib/families/celo/api/index.js.map +1 -0
- package/lib/families/celo/api/sdk.d.ts +3 -0
- package/lib/families/celo/api/sdk.d.ts.map +1 -0
- package/lib/families/celo/api/sdk.js +13 -0
- package/lib/families/celo/api/sdk.js.map +1 -0
- package/lib/families/celo/bridge/js.d.ts +8 -0
- package/lib/families/celo/bridge/js.d.ts.map +1 -0
- package/lib/families/celo/bridge/js.js +87 -0
- package/lib/families/celo/bridge/js.js.map +1 -0
- package/lib/families/celo/cli-transaction.d.ts +14 -0
- package/lib/families/celo/cli-transaction.d.ts.map +1 -0
- package/lib/families/celo/cli-transaction.js +37 -0
- package/lib/families/celo/cli-transaction.js.map +1 -0
- package/lib/families/celo/datasets/celo.scanAccounts.1.d.ts +5 -0
- package/lib/families/celo/datasets/celo.scanAccounts.1.d.ts.map +1 -0
- package/lib/families/celo/datasets/celo.scanAccounts.1.js +12 -0
- package/lib/families/celo/datasets/celo.scanAccounts.1.js.map +1 -0
- package/lib/families/celo/deviceTransactionConfig.d.ts +4 -0
- package/lib/families/celo/deviceTransactionConfig.d.ts.map +1 -0
- package/lib/families/celo/deviceTransactionConfig.js +16 -0
- package/lib/families/celo/deviceTransactionConfig.js.map +1 -0
- package/lib/families/celo/hw-app-celo.d.ts +19 -0
- package/lib/families/celo/hw-app-celo.d.ts.map +1 -0
- package/lib/families/celo/hw-app-celo.js +147 -0
- package/lib/families/celo/hw-app-celo.js.map +1 -0
- package/lib/families/celo/hw-getAddress.d.ts +2 -0
- package/lib/families/celo/hw-getAddress.d.ts.map +1 -0
- package/lib/families/celo/hw-getAddress.js +13 -0
- package/lib/families/celo/hw-getAddress.js.map +1 -0
- package/lib/families/celo/js-broadcast.d.ts +8 -0
- package/lib/families/celo/js-broadcast.d.ts.map +1 -0
- package/lib/families/celo/js-broadcast.js +58 -0
- package/lib/families/celo/js-broadcast.js.map +1 -0
- package/lib/families/celo/js-buildTransaction.d.ts +6 -0
- package/lib/families/celo/js-buildTransaction.d.ts.map +1 -0
- package/lib/families/celo/js-buildTransaction.js +89 -0
- package/lib/families/celo/js-buildTransaction.js.map +1 -0
- package/lib/families/celo/js-createTransaction.d.ts +4 -0
- package/lib/families/celo/js-createTransaction.d.ts.map +1 -0
- package/lib/families/celo/js-createTransaction.js +12 -0
- package/lib/families/celo/js-createTransaction.js.map +1 -0
- package/lib/families/celo/js-estimateMaxSpendable.d.ts +10 -0
- package/lib/families/celo/js-estimateMaxSpendable.d.ts.map +1 -0
- package/lib/families/celo/js-estimateMaxSpendable.js +77 -0
- package/lib/families/celo/js-estimateMaxSpendable.js.map +1 -0
- package/lib/families/celo/js-getFeesForTransaction.d.ts +8 -0
- package/lib/families/celo/js-getFeesForTransaction.d.ts.map +1 -0
- package/lib/families/celo/js-getFeesForTransaction.js +76 -0
- package/lib/families/celo/js-getFeesForTransaction.js.map +1 -0
- package/lib/families/celo/js-getTransactionStatus.d.ts +5 -0
- package/lib/families/celo/js-getTransactionStatus.d.ts.map +1 -0
- package/lib/families/celo/js-getTransactionStatus.js +86 -0
- package/lib/families/celo/js-getTransactionStatus.js.map +1 -0
- package/lib/families/celo/js-prepareTransaction.d.ts +5 -0
- package/lib/families/celo/js-prepareTransaction.d.ts.map +1 -0
- package/lib/families/celo/js-prepareTransaction.js +76 -0
- package/lib/families/celo/js-prepareTransaction.js.map +1 -0
- package/lib/families/celo/js-signOperation.d.ts +13 -0
- package/lib/families/celo/js-signOperation.d.ts.map +1 -0
- package/lib/families/celo/js-signOperation.js +150 -0
- package/lib/families/celo/js-signOperation.js.map +1 -0
- package/lib/families/celo/js-synchronisation.d.ts +10 -0
- package/lib/families/celo/js-synchronisation.d.ts.map +1 -0
- package/lib/families/celo/js-synchronisation.js +88 -0
- package/lib/families/celo/js-synchronisation.js.map +1 -0
- package/lib/families/celo/specs.d.ts +7 -0
- package/lib/families/celo/specs.d.ts.map +1 -0
- package/lib/families/celo/specs.js +56 -0
- package/lib/families/celo/specs.js.map +1 -0
- package/lib/families/celo/speculos-deviceActions.d.ts +7 -0
- package/lib/families/celo/speculos-deviceActions.d.ts.map +1 -0
- package/lib/families/celo/speculos-deviceActions.js +53 -0
- package/lib/families/celo/speculos-deviceActions.js.map +1 -0
- package/lib/families/celo/transaction.d.ts +11 -0
- package/lib/families/celo/transaction.d.ts.map +1 -0
- package/lib/families/celo/transaction.js +39 -0
- package/lib/families/celo/transaction.js.map +1 -0
- package/lib/families/celo/types.d.ts +16 -0
- package/lib/families/celo/types.d.ts.map +1 -0
- package/lib/families/celo/types.js +6 -0
- package/lib/families/celo/types.js.map +1 -0
- package/lib/families/ethereum/datasets/ethereum.scanAccounts.1.d.ts +1 -0
- package/lib/families/ethereum/datasets/ethereum.scanAccounts.1.d.ts.map +1 -1
- package/lib/families/ethereum/datasets/ethereum.scanAccounts.1.js +1 -0
- package/lib/families/ethereum/datasets/ethereum.scanAccounts.1.js.map +1 -1
- package/lib/families/ethereum/modules/erc1155.d.ts.map +1 -1
- package/lib/families/ethereum/modules/erc1155.js +8 -2
- package/lib/families/ethereum/modules/erc1155.js.map +1 -1
- package/lib/families/polkadot/cache.d.ts +1 -1
- package/lib/families/polkadot/cache.js +1 -1
- package/lib/families/solana/api/chain/index.d.ts +2 -2
- package/lib/families/solana/api/chain/index.d.ts.map +1 -1
- package/lib/families/solana/api/chain/index.js +1 -3
- package/lib/families/solana/api/chain/index.js.map +1 -1
- package/lib/families/solana/bridge/bridge.js +5 -5
- package/lib/families/solana/bridge/bridge.js.map +1 -1
- package/lib/families/solana/bridge/js.js +3 -3
- package/lib/families/solana/bridge/js.js.map +1 -1
- package/lib/families/solana/bridge/mock.js +1 -1
- package/lib/families/solana/bridge/mock.js.map +1 -1
- package/lib/families/solana/test-dataset.d.ts.map +1 -1
- package/lib/families/solana/test-dataset.js +211 -209
- package/lib/families/solana/test-dataset.js.map +1 -1
- package/lib/families/solana/utils.d.ts +1 -2
- package/lib/families/solana/utils.d.ts.map +1 -1
- package/lib/families/solana/utils.js +11 -9
- package/lib/families/solana/utils.js.map +1 -1
- package/lib/featureFlags/FeatureToggle.d.ts +10 -0
- package/lib/featureFlags/FeatureToggle.d.ts.map +1 -0
- package/lib/featureFlags/FeatureToggle.js +17 -0
- package/lib/featureFlags/FeatureToggle.js.map +1 -0
- package/lib/featureFlags/defaultFeatures.d.ts +3 -0
- package/lib/featureFlags/defaultFeatures.d.ts.map +1 -0
- package/lib/featureFlags/defaultFeatures.js +9 -0
- package/lib/featureFlags/defaultFeatures.js.map +1 -0
- package/lib/featureFlags/index.d.ts +5 -0
- package/lib/featureFlags/index.d.ts.map +1 -0
- package/lib/featureFlags/index.js +17 -0
- package/lib/featureFlags/index.js.map +1 -0
- package/lib/featureFlags/provider.d.ts +13 -0
- package/lib/featureFlags/provider.d.ts.map +1 -0
- package/lib/featureFlags/provider.js +68 -0
- package/lib/featureFlags/provider.js.map +1 -0
- package/lib/featureFlags/types.d.ts +8 -0
- package/lib/featureFlags/types.d.ts.map +1 -0
- package/lib/featureFlags/types.js +3 -0
- package/lib/featureFlags/types.js.map +1 -0
- package/lib/featureFlags/useFeature.d.ts +3 -0
- package/lib/featureFlags/useFeature.d.ts.map +1 -0
- package/lib/featureFlags/useFeature.js +9 -0
- package/lib/featureFlags/useFeature.js.map +1 -0
- 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 +24 -22
- package/lib/generated/bridge/js.js.map +1 -1
- package/lib/generated/cli-transaction.d.ts +9 -0
- package/lib/generated/cli-transaction.d.ts.map +1 -1
- package/lib/generated/cli-transaction.js +24 -22
- package/lib/generated/cli-transaction.js.map +1 -1
- package/lib/generated/deviceTransactionConfig.d.ts +2 -0
- package/lib/generated/deviceTransactionConfig.d.ts.map +1 -1
- package/lib/generated/deviceTransactionConfig.js +22 -20
- 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 +26 -24
- 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 +24 -22
- 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 +24 -22
- package/lib/generated/speculos-deviceActions.js.map +1 -1
- package/lib/generated/transaction.d.ts +5 -0
- package/lib/generated/transaction.d.ts.map +1 -1
- package/lib/generated/transaction.js +26 -24
- package/lib/generated/transaction.js.map +1 -1
- package/lib/generated/types.d.ts +12 -6
- package/lib/generated/types.d.ts.map +1 -1
- package/lib/generated/types.js +14 -12
- package/lib/generated/types.js.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +1 -0
- package/lib/types/index.js.map +1 -1
- package/lib/types/manager.d.ts +7 -0
- package/lib/types/manager.d.ts.map +1 -1
- package/lib/types/manager.js +7 -0
- package/lib/types/manager.js.map +1 -1
- package/package.json +8 -5
- package/src/.DS_Store +0 -0
- package/src/__tests__/.DS_Store +0 -0
- package/src/__tests__/__snapshots__/all.libcore.ts.snap +0 -33226
- package/src/__tests__/test-helpers/bridge.ts +1 -1
- package/src/__tests__/test-helpers/setup.ts +1 -0
- package/src/account/support.ts +1 -0
- package/src/apps/hw.ts +7 -0
- package/src/bot/engine.ts +1 -1
- package/src/bridge/jsHelpers.ts +1 -1
- package/src/currencies/__snapshots__/sortByMarketcap.test.ts.snap +6195 -0
- package/src/data/icons/react/celo.tsx +12 -0
- package/src/data/icons/react/index.tsx +1 -0
- package/src/data/icons/reactNative/celo.tsx +13 -0
- package/src/data/icons/reactNative/index.tsx +1 -0
- package/src/data/icons/svg/CELO.svg +5 -0
- package/src/env.ts +15 -0
- package/src/families/celo/api/hubble.ts +93 -0
- package/src/families/celo/api/index.ts +1 -0
- package/src/families/celo/api/sdk.ts +8 -0
- package/src/families/celo/bridge/js.ts +38 -0
- package/src/families/celo/cli-transaction.ts +41 -0
- package/src/families/celo/datasets/celo.scanAccounts.1.ts +20 -0
- package/src/families/celo/deviceTransactionConfig.ts +19 -0
- package/src/families/celo/hw-app-celo.ts +108 -0
- package/src/families/celo/hw-getAddress.ts +1 -0
- package/src/families/celo/js-broadcast.ts +12 -0
- package/src/families/celo/js-buildTransaction.ts +32 -0
- package/src/families/celo/js-createTransaction.ts +12 -0
- package/src/families/celo/js-estimateMaxSpendable.ts +28 -0
- package/src/families/celo/js-getFeesForTransaction.ts +38 -0
- package/src/families/celo/js-getTransactionStatus.ts +67 -0
- package/src/families/celo/js-prepareTransaction.ts +28 -0
- package/src/families/celo/js-signOperation.ts +149 -0
- package/src/families/celo/js-synchronisation.ts +40 -0
- package/src/families/celo/specs.ts +53 -0
- package/src/families/celo/speculos-deviceActions.ts +51 -0
- package/src/families/celo/transaction.ts +39 -0
- package/src/families/celo/types.ts +20 -0
- package/src/families/ethereum/datasets/ethereum.scanAccounts.1.ts +1 -0
- package/src/families/ethereum/modules/erc1155.ts +9 -0
- package/src/families/polkadot/cache.ts +1 -1
- package/src/families/solana/api/chain/index.ts +2 -5
- package/src/families/solana/bridge/bridge.ts +11 -11
- package/src/families/solana/bridge/js.ts +3 -3
- package/src/families/solana/bridge/mock.ts +1 -1
- package/src/families/solana/test-dataset.ts +340 -337
- package/src/families/solana/utils.ts +9 -8
- package/src/featureFlags/FeatureToggle.tsx +24 -0
- package/src/featureFlags/defaultFeatures.ts +7 -0
- package/src/featureFlags/index.ts +4 -0
- package/src/featureFlags/provider.tsx +48 -0
- package/src/featureFlags/types.ts +9 -0
- package/src/featureFlags/useFeature.ts +8 -0
- package/src/generated/bridge/js.ts +3 -0
- package/src/generated/cli-transaction.ts +3 -0
- package/src/generated/deviceTransactionConfig.ts +3 -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 +14 -0
- package/src/types/index.ts +1 -0
- package/src/types/manager.ts +7 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
interface Props {
|
|
4
|
+
size: number;
|
|
5
|
+
color?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
function celo({size, color = "currentColor"}: Props) {
|
|
9
|
+
return <svg width={size} height={size} viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.1053 19.1053C12.9834 19.1053 15.3158 16.7728 15.3158 13.8947C15.3158 11.0166 12.9834 8.68421 10.1053 8.68421C7.22716 8.68421 4.89474 11.0166 4.89474 13.8947C4.89474 16.7728 7.22716 19.1053 10.1053 19.1053ZM10.1053 21C6.18126 21 3 17.8187 3 13.8947C3 9.97074 6.18126 6.78947 10.1053 6.78947C14.0293 6.78947 17.2105 9.97074 17.2105 13.8947C17.2105 17.8187 14.0293 21 10.1053 21Z" fill={color} /><path d="M13.8947 15.3158C16.7728 15.3158 19.1053 12.9834 19.1053 10.1053C19.1053 7.22716 16.7728 4.89474 13.8947 4.89474C11.0166 4.89474 8.68421 7.22716 8.68421 10.1053C8.68421 12.9834 11.0166 15.3158 13.8947 15.3158ZM13.8947 17.2105C9.97074 17.2105 6.78947 14.0293 6.78947 10.1053C6.78947 6.18126 9.97074 3 13.8947 3C17.8187 3 21 6.18126 21 10.1053C21 14.0293 17.8187 17.2105 13.8947 17.2105Z" fill={color} /><path d="M14.1297 17.2105C14.6223 16.6137 14.9747 15.9145 15.1623 15.1623C15.9126 14.9747 16.6118 14.6223 17.2105 14.1297C17.184 14.9994 16.9964 15.8558 16.6573 16.6592C15.8558 16.9964 14.9994 17.184 14.1297 17.2105ZM8.83768 8.83768C8.08737 9.02526 7.38821 9.37768 6.78947 9.87032C6.816 9.00063 7.00358 8.14421 7.34274 7.34274C8.14421 7.00547 9.00253 6.81789 9.87032 6.78947C9.37768 7.38632 9.02526 8.08547 8.83768 8.83768Z" fill={color} /></svg>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default celo;
|
|
@@ -78,6 +78,7 @@ export { default as call } from "./call";
|
|
|
78
78
|
export { default as cc } from "./cc";
|
|
79
79
|
export { default as cdn } from "./cdn";
|
|
80
80
|
export { default as cdt } from "./cdt";
|
|
81
|
+
export { default as celo } from "./celo";
|
|
81
82
|
export { default as cenz } from "./cenz";
|
|
82
83
|
export { default as chain } from "./chain";
|
|
83
84
|
export { default as chat } from "./chat";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import Svg, { Path } from "react-native-svg";
|
|
4
|
+
interface Props {
|
|
5
|
+
size: number;
|
|
6
|
+
color: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
function celo({ size, color }: Props) {
|
|
10
|
+
return <Svg width={size} height={size} viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><Path d="M10.1053 19.1053C12.9834 19.1053 15.3158 16.7728 15.3158 13.8947C15.3158 11.0166 12.9834 8.68421 10.1053 8.68421C7.22716 8.68421 4.89474 11.0166 4.89474 13.8947C4.89474 16.7728 7.22716 19.1053 10.1053 19.1053ZM10.1053 21C6.18126 21 3 17.8187 3 13.8947C3 9.97074 6.18126 6.78947 10.1053 6.78947C14.0293 6.78947 17.2105 9.97074 17.2105 13.8947C17.2105 17.8187 14.0293 21 10.1053 21Z" fill={color} /><Path d="M13.8947 15.3158C16.7728 15.3158 19.1053 12.9834 19.1053 10.1053C19.1053 7.22716 16.7728 4.89474 13.8947 4.89474C11.0166 4.89474 8.68421 7.22716 8.68421 10.1053C8.68421 12.9834 11.0166 15.3158 13.8947 15.3158ZM13.8947 17.2105C9.97074 17.2105 6.78947 14.0293 6.78947 10.1053C6.78947 6.18126 9.97074 3 13.8947 3C17.8187 3 21 6.18126 21 10.1053C21 14.0293 17.8187 17.2105 13.8947 17.2105Z" fill={color} /><Path d="M14.1297 17.2105C14.6223 16.6137 14.9747 15.9145 15.1623 15.1623C15.9126 14.9747 16.6118 14.6223 17.2105 14.1297C17.184 14.9994 16.9964 15.8558 16.6573 16.6592C15.8558 16.9964 14.9994 17.184 14.1297 17.2105ZM8.83768 8.83768C8.08737 9.02526 7.38821 9.37768 6.78947 9.87032C6.816 9.00063 7.00358 8.14421 7.34274 7.34274C8.14421 7.00547 9.00253 6.81789 9.87032 6.78947C9.37768 7.38632 9.02526 8.08547 8.83768 8.83768Z" fill={color} /></Svg>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default celo;
|
|
@@ -78,6 +78,7 @@ export { default as call } from "./call";
|
|
|
78
78
|
export { default as cc } from "./cc";
|
|
79
79
|
export { default as cdn } from "./cdn";
|
|
80
80
|
export { default as cdt } from "./cdt";
|
|
81
|
+
export { default as celo } from "./celo";
|
|
81
82
|
export { default as cenz } from "./cenz";
|
|
82
83
|
export { default as chain } from "./chain";
|
|
83
84
|
export { default as chat } from "./chat";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M10.1053 19.1053C12.9834 19.1053 15.3158 16.7728 15.3158 13.8947C15.3158 11.0166 12.9834 8.68421 10.1053 8.68421C7.22716 8.68421 4.89474 11.0166 4.89474 13.8947C4.89474 16.7728 7.22716 19.1053 10.1053 19.1053ZM10.1053 21C6.18126 21 3 17.8187 3 13.8947C3 9.97074 6.18126 6.78947 10.1053 6.78947C14.0293 6.78947 17.2105 9.97074 17.2105 13.8947C17.2105 17.8187 14.0293 21 10.1053 21Z" fill="#42D689"/>
|
|
3
|
+
<path d="M13.8947 15.3158C16.7728 15.3158 19.1053 12.9834 19.1053 10.1053C19.1053 7.22716 16.7728 4.89474 13.8947 4.89474C11.0166 4.89474 8.68421 7.22716 8.68421 10.1053C8.68421 12.9834 11.0166 15.3158 13.8947 15.3158ZM13.8947 17.2105C9.97074 17.2105 6.78947 14.0293 6.78947 10.1053C6.78947 6.18126 9.97074 3 13.8947 3C17.8187 3 21 6.18126 21 10.1053C21 14.0293 17.8187 17.2105 13.8947 17.2105Z" fill="#42D689"/>
|
|
4
|
+
<path d="M14.1297 17.2105C14.6223 16.6137 14.9747 15.9145 15.1623 15.1623C15.9126 14.9747 16.6118 14.6223 17.2105 14.1297C17.184 14.9994 16.9964 15.8558 16.6573 16.6592C15.8558 16.9964 14.9994 17.184 14.1297 17.2105ZM8.83768 8.83768C8.08737 9.02526 7.38821 9.37768 6.78947 9.87032C6.816 9.00063 7.00358 8.14421 7.34274 7.34274C8.14421 7.00547 9.00253 6.81789 9.87032 6.78947C9.37768 7.38632 9.02526 8.08547 8.83768 8.83768Z" fill="#42D689"/>
|
|
5
|
+
</svg>
|
package/src/env.ts
CHANGED
|
@@ -40,6 +40,16 @@ const envDefinitions = {
|
|
|
40
40
|
parser: stringParser,
|
|
41
41
|
desc: "Node API endpoint for algorand",
|
|
42
42
|
},
|
|
43
|
+
API_CELO_INDEXER: {
|
|
44
|
+
def: "https://celo.coin.ledger.com/indexer/",
|
|
45
|
+
parser: stringParser,
|
|
46
|
+
desc: "Explorer API for celo",
|
|
47
|
+
},
|
|
48
|
+
API_CELO_NODE: {
|
|
49
|
+
def: "https://celo.coin.ledger.com/archive/",
|
|
50
|
+
parser: stringParser,
|
|
51
|
+
desc: "Node endpoint for celo",
|
|
52
|
+
},
|
|
43
53
|
API_COSMOS_BLOCKCHAIN_EXPLORER_API_ENDPOINT: {
|
|
44
54
|
def: "https://cosmoshub4.coin.ledger.com/",
|
|
45
55
|
parser: stringParser,
|
|
@@ -120,6 +130,11 @@ const envDefinitions = {
|
|
|
120
130
|
def: "https://tron.coin.ledger.com",
|
|
121
131
|
desc: "proxy url for trongrid API",
|
|
122
132
|
},
|
|
133
|
+
API_SOLANA_PROXY: {
|
|
134
|
+
parser: stringParser,
|
|
135
|
+
def: "https://solana.coin.ledger.com",
|
|
136
|
+
desc: "proxy url for solana API",
|
|
137
|
+
},
|
|
123
138
|
BASE_SOCKET_URL: {
|
|
124
139
|
def: "wss://scriptrunner.api.live.ledger.com/update",
|
|
125
140
|
parser: stringParser,
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { BigNumber } from "bignumber.js";
|
|
2
|
+
import network from "../../../network";
|
|
3
|
+
import { getEnv } from "../../../env";
|
|
4
|
+
import { Operation, OperationType } from "../../../types";
|
|
5
|
+
import { encodeOperationId } from "../../../operation";
|
|
6
|
+
|
|
7
|
+
const DEFAULT_TRANSACTIONS_LIMIT = 200;
|
|
8
|
+
const getUrl = (route): string => `${getEnv("API_CELO_INDEXER")}${route || ""}`;
|
|
9
|
+
|
|
10
|
+
// Indexer returns both account data and transactions in one call.
|
|
11
|
+
// Transactions are just limited, there's no block height offset
|
|
12
|
+
const fetchAccountDetails = async (
|
|
13
|
+
address: string,
|
|
14
|
+
transactionsLimit: number = DEFAULT_TRANSACTIONS_LIMIT
|
|
15
|
+
) => {
|
|
16
|
+
const { data } = await network({
|
|
17
|
+
method: "GET",
|
|
18
|
+
url: getUrl(`/account_details/${address}?limit=${transactionsLimit}`),
|
|
19
|
+
});
|
|
20
|
+
return data;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const fetchStatus = async () => {
|
|
24
|
+
const { data } = await network({
|
|
25
|
+
method: "GET",
|
|
26
|
+
url: getUrl(`/status`),
|
|
27
|
+
});
|
|
28
|
+
return data;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const getOperationType = (type: string): OperationType => {
|
|
32
|
+
switch (type) {
|
|
33
|
+
case "InternalTransferSent":
|
|
34
|
+
return "OUT";
|
|
35
|
+
case "InternalTransferReceived":
|
|
36
|
+
return "IN";
|
|
37
|
+
case "AccountSlashed":
|
|
38
|
+
return "SLASH";
|
|
39
|
+
default:
|
|
40
|
+
return "NONE";
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const transactionToOperation = (
|
|
45
|
+
address: string,
|
|
46
|
+
accountId: string,
|
|
47
|
+
transaction
|
|
48
|
+
): Operation => {
|
|
49
|
+
const type: OperationType = getOperationType(transaction.kind);
|
|
50
|
+
const hasFailed = transaction.data.success
|
|
51
|
+
? !transaction.data.success
|
|
52
|
+
: false;
|
|
53
|
+
const senders = transaction.data.from ? [transaction.data.from] : [];
|
|
54
|
+
const recipients = transaction.data.to ? [transaction.data.to] : [];
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
id: encodeOperationId(accountId, transaction.transaction_hash, type),
|
|
58
|
+
hash: transaction.transaction_hash,
|
|
59
|
+
accountId,
|
|
60
|
+
fee: new BigNumber(0),
|
|
61
|
+
value: new BigNumber(transaction.amount),
|
|
62
|
+
type,
|
|
63
|
+
blockHeight: transaction.height,
|
|
64
|
+
date: new Date(transaction.time),
|
|
65
|
+
senders,
|
|
66
|
+
recipients,
|
|
67
|
+
hasFailed,
|
|
68
|
+
blockHash: null,
|
|
69
|
+
extra: {},
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const getAccountDetails = async (address: string, accountId: string) => {
|
|
74
|
+
const accountDetails = await fetchAccountDetails(address);
|
|
75
|
+
const spendableBalance = new BigNumber(accountDetails.gold_balance);
|
|
76
|
+
const lockedBalance = new BigNumber(accountDetails.total_locked_gold);
|
|
77
|
+
const balance = spendableBalance.plus(lockedBalance);
|
|
78
|
+
const indexerStatus = await fetchStatus();
|
|
79
|
+
|
|
80
|
+
const allTransactions = accountDetails.internal_transfers.concat(
|
|
81
|
+
accountDetails.transactions
|
|
82
|
+
);
|
|
83
|
+
const operations = allTransactions.map((transaction) =>
|
|
84
|
+
transactionToOperation(address, accountId, transaction)
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
blockHeight: indexerStatus.last_indexed_height,
|
|
89
|
+
balance,
|
|
90
|
+
spendableBalance,
|
|
91
|
+
operations,
|
|
92
|
+
};
|
|
93
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getAccountDetails } from "./hubble";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AccountBridge, CurrencyBridge } from "../../../types";
|
|
2
|
+
import type { Transaction } from "../types";
|
|
3
|
+
import { makeAccountBridgeReceive } from "../../../bridge/jsHelpers";
|
|
4
|
+
import { sync, scanAccounts } from "../js-synchronisation";
|
|
5
|
+
import signOperation from "../js-signOperation";
|
|
6
|
+
import getTransactionStatus from "../js-getTransactionStatus";
|
|
7
|
+
import broadcast from "../js-broadcast";
|
|
8
|
+
import estimateMaxSpendable from "../js-estimateMaxSpendable";
|
|
9
|
+
import prepareTransaction from "../js-prepareTransaction";
|
|
10
|
+
import createTransaction from "../js-createTransaction";
|
|
11
|
+
|
|
12
|
+
const updateTransaction = (t, patch) => ({ ...t, ...patch });
|
|
13
|
+
|
|
14
|
+
const receive = makeAccountBridgeReceive();
|
|
15
|
+
|
|
16
|
+
const preload = async () => Promise.resolve({});
|
|
17
|
+
const hydrate = (): void => {};
|
|
18
|
+
|
|
19
|
+
const currencyBridge: CurrencyBridge = {
|
|
20
|
+
preload,
|
|
21
|
+
hydrate,
|
|
22
|
+
scanAccounts,
|
|
23
|
+
};
|
|
24
|
+
const accountBridge: AccountBridge<Transaction> = {
|
|
25
|
+
estimateMaxSpendable,
|
|
26
|
+
createTransaction,
|
|
27
|
+
updateTransaction,
|
|
28
|
+
getTransactionStatus,
|
|
29
|
+
prepareTransaction,
|
|
30
|
+
sync,
|
|
31
|
+
receive,
|
|
32
|
+
signOperation,
|
|
33
|
+
broadcast,
|
|
34
|
+
};
|
|
35
|
+
export default {
|
|
36
|
+
currencyBridge,
|
|
37
|
+
accountBridge,
|
|
38
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import invariant from "invariant";
|
|
2
|
+
import flatMap from "lodash/flatMap";
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
Transaction,
|
|
6
|
+
Account,
|
|
7
|
+
AccountLike,
|
|
8
|
+
AccountLikeArray,
|
|
9
|
+
} from "../../types";
|
|
10
|
+
|
|
11
|
+
const options = [];
|
|
12
|
+
|
|
13
|
+
function inferAccounts(account: Account): AccountLikeArray {
|
|
14
|
+
invariant(account.currency.family === "celo", "celo family");
|
|
15
|
+
|
|
16
|
+
const accounts: Account[] = [account];
|
|
17
|
+
return accounts;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function inferTransactions(
|
|
21
|
+
transactions: Array<{
|
|
22
|
+
account: AccountLike;
|
|
23
|
+
transaction: Transaction;
|
|
24
|
+
mainAccount: Account;
|
|
25
|
+
}>
|
|
26
|
+
): Transaction[] {
|
|
27
|
+
return flatMap(transactions, ({ transaction }) => {
|
|
28
|
+
invariant(transaction.family === "celo", "celo family");
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
...transaction,
|
|
32
|
+
family: "celo",
|
|
33
|
+
} as Transaction;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default {
|
|
38
|
+
options,
|
|
39
|
+
inferAccounts,
|
|
40
|
+
inferTransactions,
|
|
41
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CurrenciesData } from "../../../types";
|
|
2
|
+
import type { Transaction } from "../types";
|
|
3
|
+
|
|
4
|
+
const dataset: CurrenciesData<Transaction> = {
|
|
5
|
+
scanAccounts: [
|
|
6
|
+
{
|
|
7
|
+
name: "celo seed 1",
|
|
8
|
+
apdus: `
|
|
9
|
+
=> e002000009028000002c8000ce10
|
|
10
|
+
<= 41040106794f46b69e1ae56dff904510959e59074a37341f8cc740e9ce7a0b24421c42e7023481f5ef03926739baa6bb26cac7bf48f249a24793264711d48499499528433235323935323541463035434134313939633236413838623438393463383342303330433733399000
|
|
11
|
+
=> e002000015058000002c8000ce10800000000000000000000000
|
|
12
|
+
<= 41044f4998c3f81966645f25e95082f9fe7d104b1ba4286486a8ecd8fd11f79ef02bd8110f086b390a418ab619a650f3df59a3c84912ce1ea125386d7aa7732fcd0b28393634313334336638346535304143304334434133626644313244433063346231653732363544359000
|
|
13
|
+
=> e002000015058000002c8000ce10800000010000000000000000
|
|
14
|
+
<= 4104630b6447b0f690520a5612f1dc57da90b84f6b59dfeb375bed1113fb34a8d0f9181ec63e40f9fde05761084dbd022ba76711eb2b36442cf4b5d2bc19def9156428343435306565646238623532333931354534393639633239646241653944354563303646453837349000
|
|
15
|
+
`,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default dataset;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DeviceTransactionField } from "../../transaction";
|
|
2
|
+
|
|
3
|
+
function getDeviceTransactionConfig(): Array<DeviceTransactionField> {
|
|
4
|
+
const fields: Array<DeviceTransactionField> = [];
|
|
5
|
+
|
|
6
|
+
fields.push({
|
|
7
|
+
type: "amount",
|
|
8
|
+
label: "Amount",
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
fields.push({
|
|
12
|
+
type: "fees",
|
|
13
|
+
label: "Fees",
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
return fields;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default getDeviceTransactionConfig;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type Transport from "@ledgerhq/hw-transport";
|
|
2
|
+
import { decode, encode } from "rlp";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Heavily inspiried by celo-web-wallet
|
|
6
|
+
* https://github.com/celo-tools/celo-web-wallet/blob/master/src/features/ledger/CeloLedgerApp.ts
|
|
7
|
+
*/
|
|
8
|
+
export class CeloApp {
|
|
9
|
+
transport: Transport;
|
|
10
|
+
|
|
11
|
+
constructor(transport: any) {
|
|
12
|
+
this.transport = transport;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async signTransaction(
|
|
16
|
+
path: string,
|
|
17
|
+
rawTxHex: string
|
|
18
|
+
): Promise<{
|
|
19
|
+
s: string;
|
|
20
|
+
v: string;
|
|
21
|
+
r: string;
|
|
22
|
+
}> {
|
|
23
|
+
const paths = splitPath(path);
|
|
24
|
+
const rawTx = Buffer.from(rawTxHex, "hex");
|
|
25
|
+
let offset = 0;
|
|
26
|
+
let response;
|
|
27
|
+
|
|
28
|
+
const rlpTx = decode(rawTx);
|
|
29
|
+
let rlpOffset = 0;
|
|
30
|
+
if (rlpTx.length > 6) {
|
|
31
|
+
const rlpVrs = encode(rlpTx.slice(-3));
|
|
32
|
+
rlpOffset = rawTx.length - (rlpVrs.length - 1);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
while (offset !== rawTx.length) {
|
|
36
|
+
const first = offset === 0;
|
|
37
|
+
const maxChunkSize = first ? 150 - 1 - paths.length * 4 : 150;
|
|
38
|
+
let chunkSize =
|
|
39
|
+
offset + maxChunkSize > rawTx.length
|
|
40
|
+
? rawTx.length - offset
|
|
41
|
+
: maxChunkSize;
|
|
42
|
+
if (rlpOffset != 0 && offset + chunkSize == rlpOffset) {
|
|
43
|
+
// Make sure that the chunk doesn't end right on the EIP 155 marker if set
|
|
44
|
+
chunkSize--;
|
|
45
|
+
}
|
|
46
|
+
const buffer = Buffer.alloc(
|
|
47
|
+
first ? 1 + paths.length * 4 + chunkSize : chunkSize
|
|
48
|
+
);
|
|
49
|
+
if (first) {
|
|
50
|
+
buffer[0] = paths.length;
|
|
51
|
+
paths.forEach((element, index) => {
|
|
52
|
+
buffer.writeUInt32BE(element, 1 + 4 * index);
|
|
53
|
+
});
|
|
54
|
+
rawTx.copy(buffer, 1 + 4 * paths.length, offset, offset + chunkSize);
|
|
55
|
+
} else {
|
|
56
|
+
rawTx.copy(buffer, 0, offset, offset + chunkSize);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
response = await this.transport
|
|
60
|
+
.send(0xe0, 0x04, first ? 0x00 : 0x80, 0x00, buffer)
|
|
61
|
+
.catch((e) => {
|
|
62
|
+
throw e;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
offset += chunkSize;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const v = response.slice(0, 1).toString("hex");
|
|
69
|
+
const r = response.slice(1, 1 + 32).toString("hex");
|
|
70
|
+
const s = response.slice(1 + 32, 1 + 32 + 32).toString("hex");
|
|
71
|
+
return { v, r, s };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
provideERC20TokenInformation({ data }: { data: Buffer }): Promise<boolean> {
|
|
75
|
+
return provideERC20TokenInformation(this.transport, data);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function splitPath(path: string): number[] {
|
|
80
|
+
const result: number[] = [];
|
|
81
|
+
const components = path.split("/");
|
|
82
|
+
components.forEach((element) => {
|
|
83
|
+
let number = parseInt(element, 10);
|
|
84
|
+
if (isNaN(number)) {
|
|
85
|
+
return; // FIXME shouldn't it throws instead?
|
|
86
|
+
}
|
|
87
|
+
if (element.length > 1 && element[element.length - 1] === "'") {
|
|
88
|
+
number += 0x80000000;
|
|
89
|
+
}
|
|
90
|
+
result.push(number);
|
|
91
|
+
});
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function provideERC20TokenInformation(
|
|
96
|
+
transport: Transport,
|
|
97
|
+
data: Buffer
|
|
98
|
+
): Promise<boolean> {
|
|
99
|
+
return transport.send(0xe0, 0x0a, 0x00, 0x00, data).then(
|
|
100
|
+
() => true,
|
|
101
|
+
(e) => {
|
|
102
|
+
if (e && e.statusCode === 0x6d00) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
throw e;
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "../ethereum/hw-getAddress";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { patchOperationWithHash } from "../../operation";
|
|
2
|
+
import { celoKit } from "./api/sdk";
|
|
3
|
+
|
|
4
|
+
const broadcast = async ({ signedOperation: { operation, signature } }) => {
|
|
5
|
+
const kit = celoKit();
|
|
6
|
+
const { transactionHash } = await kit.web3.eth.sendSignedTransaction(
|
|
7
|
+
signature
|
|
8
|
+
);
|
|
9
|
+
return patchOperationWithHash(operation, transactionHash);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default broadcast;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Transaction } from "./types";
|
|
2
|
+
import type { Account } from "../../types";
|
|
3
|
+
import { CeloTx } from "@celo/connect";
|
|
4
|
+
import { celoKit } from "./api/sdk";
|
|
5
|
+
|
|
6
|
+
const buildTransaction = async (account: Account, transaction: Transaction) => {
|
|
7
|
+
const kit = celoKit();
|
|
8
|
+
const { amount } = transaction;
|
|
9
|
+
const value = transaction.useAllAmount
|
|
10
|
+
? account.spendableBalance.minus(transaction.fees || 0)
|
|
11
|
+
: amount;
|
|
12
|
+
|
|
13
|
+
const celoToken = await kit.contracts.getGoldToken();
|
|
14
|
+
|
|
15
|
+
const celoTransaction = {
|
|
16
|
+
from: account.freshAddress,
|
|
17
|
+
to: celoToken.address,
|
|
18
|
+
data: celoToken
|
|
19
|
+
.transfer(transaction.recipient, value.toFixed())
|
|
20
|
+
.txo.encodeABI(),
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
...celoTransaction,
|
|
25
|
+
chainId: await kit.connection.chainId(),
|
|
26
|
+
nonce: await kit.connection.nonce(account.freshAddress),
|
|
27
|
+
gas: await kit.connection.estimateGasWithInflationFactor(celoTransaction),
|
|
28
|
+
gasPrice: await kit.connection.gasPrice(),
|
|
29
|
+
} as CeloTx;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default buildTransaction;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Transaction } from "./types";
|
|
2
|
+
import { BigNumber } from "bignumber.js";
|
|
3
|
+
|
|
4
|
+
const createTransaction = (): Transaction => ({
|
|
5
|
+
family: "celo",
|
|
6
|
+
amount: new BigNumber(0),
|
|
7
|
+
recipient: "",
|
|
8
|
+
useAllAmount: false,
|
|
9
|
+
fees: null,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export default createTransaction;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Account, AccountLike } from "../../types";
|
|
2
|
+
import { Transaction } from "./types";
|
|
3
|
+
import { BigNumber } from "bignumber.js";
|
|
4
|
+
import { getMainAccount } from "../../account";
|
|
5
|
+
import getTransactionStatus from "./js-getTransactionStatus";
|
|
6
|
+
import prepareTransaction from "./js-prepareTransaction";
|
|
7
|
+
import createTransaction from "./js-createTransaction";
|
|
8
|
+
|
|
9
|
+
const estimateMaxSpendable = async ({
|
|
10
|
+
account,
|
|
11
|
+
parentAccount,
|
|
12
|
+
transaction,
|
|
13
|
+
}: {
|
|
14
|
+
account: AccountLike;
|
|
15
|
+
parentAccount: Account;
|
|
16
|
+
transaction: Transaction;
|
|
17
|
+
}): Promise<BigNumber> => {
|
|
18
|
+
const mainAccount = getMainAccount(account, parentAccount);
|
|
19
|
+
const t = await prepareTransaction(mainAccount, {
|
|
20
|
+
...createTransaction(),
|
|
21
|
+
...transaction,
|
|
22
|
+
useAllAmount: true,
|
|
23
|
+
});
|
|
24
|
+
const s = await getTransactionStatus(mainAccount, t);
|
|
25
|
+
return s.amount;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default estimateMaxSpendable;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BigNumber } from "bignumber.js";
|
|
2
|
+
import { Account, Transaction } from "../../types";
|
|
3
|
+
import { celoKit } from "./api/sdk";
|
|
4
|
+
|
|
5
|
+
const getFeesForTransaction = async ({
|
|
6
|
+
account,
|
|
7
|
+
transaction,
|
|
8
|
+
}: {
|
|
9
|
+
account: Account;
|
|
10
|
+
transaction: Transaction;
|
|
11
|
+
}): Promise<BigNumber> => {
|
|
12
|
+
const { amount } = transaction;
|
|
13
|
+
const kit = celoKit();
|
|
14
|
+
|
|
15
|
+
// A workaround - estimating gas throws an error if value > funds
|
|
16
|
+
const value = transaction.useAllAmount
|
|
17
|
+
? account.spendableBalance
|
|
18
|
+
: BigNumber.minimum(amount, account.spendableBalance);
|
|
19
|
+
|
|
20
|
+
const celoToken = await kit.contracts.getGoldToken();
|
|
21
|
+
|
|
22
|
+
const celoTransaction = {
|
|
23
|
+
from: account.freshAddress,
|
|
24
|
+
to: celoToken.address,
|
|
25
|
+
data: celoToken
|
|
26
|
+
.transfer(transaction.recipient, value.toFixed())
|
|
27
|
+
.txo.encodeABI(),
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const gasPrice = new BigNumber(await kit.connection.gasPrice());
|
|
31
|
+
const gas = await kit.connection.estimateGasWithInflationFactor(
|
|
32
|
+
celoTransaction
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
return gasPrice.times(gas);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default getFeesForTransaction;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Account, TransactionStatus } from "../../types";
|
|
2
|
+
import { Transaction } from "./types";
|
|
3
|
+
import {
|
|
4
|
+
AmountRequired,
|
|
5
|
+
FeeNotLoaded,
|
|
6
|
+
InvalidAddress,
|
|
7
|
+
InvalidAddressBecauseDestinationIsAlsoSource,
|
|
8
|
+
NotEnoughBalance,
|
|
9
|
+
RecipientRequired,
|
|
10
|
+
} from "@ledgerhq/errors";
|
|
11
|
+
import { BigNumber } from "bignumber.js";
|
|
12
|
+
import { isValidAddress } from "@celo/utils/lib/address";
|
|
13
|
+
|
|
14
|
+
const getTransactionStatus = async (
|
|
15
|
+
account: Account,
|
|
16
|
+
transaction: Transaction
|
|
17
|
+
): Promise<TransactionStatus> => {
|
|
18
|
+
const errors: any = {};
|
|
19
|
+
const warnings: any = {};
|
|
20
|
+
const useAllAmount = !!transaction.useAllAmount;
|
|
21
|
+
|
|
22
|
+
if (account.freshAddress === transaction.recipient) {
|
|
23
|
+
errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (!transaction.fees || !transaction.fees.gt(0)) {
|
|
27
|
+
errors.fees = new FeeNotLoaded();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const estimatedFees = transaction.fees || new BigNumber(0);
|
|
31
|
+
|
|
32
|
+
const amount = useAllAmount
|
|
33
|
+
? account.spendableBalance.minus(estimatedFees)
|
|
34
|
+
: new BigNumber(transaction.amount);
|
|
35
|
+
|
|
36
|
+
if (amount.lte(0) && !transaction.useAllAmount) {
|
|
37
|
+
errors.amount = new AmountRequired();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const totalSpent = amount.plus(estimatedFees);
|
|
41
|
+
|
|
42
|
+
if (totalSpent.gt(account.spendableBalance)) {
|
|
43
|
+
errors.amount = new NotEnoughBalance();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!errors.amount && account.spendableBalance.lt(estimatedFees)) {
|
|
47
|
+
errors.amount = new NotEnoughBalance();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!transaction.recipient) {
|
|
51
|
+
errors.recipient = new RecipientRequired();
|
|
52
|
+
} else if (!isValidAddress(transaction.recipient)) {
|
|
53
|
+
errors.recipient = new InvalidAddress("", {
|
|
54
|
+
currencyName: account.currency.name,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return Promise.resolve({
|
|
59
|
+
errors,
|
|
60
|
+
warnings,
|
|
61
|
+
estimatedFees,
|
|
62
|
+
amount,
|
|
63
|
+
totalSpent,
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export default getTransactionStatus;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Account } from "../../types";
|
|
2
|
+
import { Transaction } from "./types";
|
|
3
|
+
import getFeesForTransaction from "./js-getFeesForTransaction";
|
|
4
|
+
import { isValidAddress } from "@celo/utils/lib/address";
|
|
5
|
+
|
|
6
|
+
const sameFees = (a, b) => (!a || !b ? a === b : a.eq(b));
|
|
7
|
+
|
|
8
|
+
const prepareTransaction = async (
|
|
9
|
+
account: Account,
|
|
10
|
+
transaction: Transaction
|
|
11
|
+
) => {
|
|
12
|
+
if (
|
|
13
|
+
!transaction.recipient ||
|
|
14
|
+
(transaction.recipient && !isValidAddress(transaction.recipient))
|
|
15
|
+
) {
|
|
16
|
+
return transaction;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const fees = await getFeesForTransaction({ account, transaction });
|
|
20
|
+
|
|
21
|
+
if (!sameFees(transaction.fees, fees)) {
|
|
22
|
+
return { ...transaction, fees };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return transaction;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default prepareTransaction;
|