@ledgerhq/live-common 21.30.1 → 21.31.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/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/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 +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/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/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/package.json +4 -1
- package/src/.DS_Store +0 -0
- package/src/{data/flags → __tests__}/.DS_Store +0 -0
- package/src/__tests__/__snapshots__/all.libcore.ts.snap +0 -33029
- package/src/__tests__/test-helpers/setup.ts +1 -0
- package/src/account/support.ts +1 -0
- package/src/bot/engine.ts +1 -1
- package/src/bridge/jsHelpers.ts +1 -1
- 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 +10 -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/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
|
@@ -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;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { BigNumber } from "bignumber.js";
|
|
2
|
+
import { Observable } from "rxjs";
|
|
3
|
+
import { FeeNotLoaded } from "@ledgerhq/errors";
|
|
4
|
+
import type { Transaction } from "./types";
|
|
5
|
+
import type { Account, Operation, SignOperationEvent } from "../../types";
|
|
6
|
+
import { encodeOperationId } from "../../operation";
|
|
7
|
+
import { CeloApp } from "./hw-app-celo";
|
|
8
|
+
import buildTransaction from "./js-buildTransaction";
|
|
9
|
+
import { rlpEncodedTx, encodeTransaction } from "@celo/wallet-base";
|
|
10
|
+
import { tokenInfoByAddressAndChainId } from "@celo/wallet-ledger/lib/tokens";
|
|
11
|
+
import { withDevice } from "../../hw/deviceAccess";
|
|
12
|
+
|
|
13
|
+
const buildOptimisticOperation = (
|
|
14
|
+
account: Account,
|
|
15
|
+
transaction: Transaction,
|
|
16
|
+
fee: BigNumber
|
|
17
|
+
): Operation => {
|
|
18
|
+
const type = "OUT";
|
|
19
|
+
|
|
20
|
+
const value = new BigNumber(transaction.amount).plus(fee);
|
|
21
|
+
|
|
22
|
+
const operation: Operation = {
|
|
23
|
+
id: encodeOperationId(account.id, "", type),
|
|
24
|
+
hash: "",
|
|
25
|
+
type,
|
|
26
|
+
value,
|
|
27
|
+
fee,
|
|
28
|
+
blockHash: null,
|
|
29
|
+
blockHeight: null,
|
|
30
|
+
senders: [account.freshAddress],
|
|
31
|
+
recipients: [transaction.recipient].filter(Boolean),
|
|
32
|
+
accountId: account.id,
|
|
33
|
+
date: new Date(),
|
|
34
|
+
extra: { additionalField: transaction.amount },
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
return operation;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const trimLeading0x = (input: string) =>
|
|
41
|
+
input.startsWith("0x") ? input.slice(2) : input;
|
|
42
|
+
|
|
43
|
+
const parseSigningResponse = (
|
|
44
|
+
response: {
|
|
45
|
+
s: string;
|
|
46
|
+
v: string;
|
|
47
|
+
r: string;
|
|
48
|
+
},
|
|
49
|
+
chainId: number
|
|
50
|
+
): {
|
|
51
|
+
s: Buffer;
|
|
52
|
+
v: number;
|
|
53
|
+
r: Buffer;
|
|
54
|
+
} => {
|
|
55
|
+
// EIP155
|
|
56
|
+
const sigV = parseInt(response.v, 16);
|
|
57
|
+
let eip155V = chainId * 2 + 35;
|
|
58
|
+
if (sigV !== eip155V && (sigV & eip155V) !== sigV) {
|
|
59
|
+
eip155V += 1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
s: Buffer.from(response.s, "hex"),
|
|
64
|
+
v: eip155V,
|
|
65
|
+
r: Buffer.from(response.r, "hex"),
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Sign Transaction with Ledger hardware
|
|
71
|
+
*/
|
|
72
|
+
const signOperation = ({
|
|
73
|
+
account,
|
|
74
|
+
deviceId,
|
|
75
|
+
transaction,
|
|
76
|
+
}: {
|
|
77
|
+
account: Account;
|
|
78
|
+
deviceId: any;
|
|
79
|
+
transaction: Transaction;
|
|
80
|
+
}): Observable<SignOperationEvent> =>
|
|
81
|
+
withDevice(deviceId)(
|
|
82
|
+
(transport) =>
|
|
83
|
+
new Observable((o) => {
|
|
84
|
+
let cancelled;
|
|
85
|
+
|
|
86
|
+
async function main() {
|
|
87
|
+
if (!transaction.fees) {
|
|
88
|
+
throw new FeeNotLoaded();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const celo = new CeloApp(transport);
|
|
92
|
+
const unsignedTransaction = await buildTransaction(
|
|
93
|
+
account,
|
|
94
|
+
transaction
|
|
95
|
+
);
|
|
96
|
+
const { chainId, to } = unsignedTransaction;
|
|
97
|
+
const rlpEncodedTransaction = rlpEncodedTx(unsignedTransaction);
|
|
98
|
+
|
|
99
|
+
const tokenInfo = tokenInfoByAddressAndChainId(to!, chainId!);
|
|
100
|
+
if (tokenInfo) {
|
|
101
|
+
await celo.provideERC20TokenInformation(tokenInfo);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
o.next({ type: "device-signature-requested" });
|
|
105
|
+
|
|
106
|
+
const response = await celo.signTransaction(
|
|
107
|
+
account.freshAddressPath,
|
|
108
|
+
trimLeading0x(rlpEncodedTransaction.rlpEncode)
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
if (cancelled) return;
|
|
112
|
+
|
|
113
|
+
const signature = parseSigningResponse(response, chainId!);
|
|
114
|
+
|
|
115
|
+
o.next({ type: "device-signature-granted" });
|
|
116
|
+
|
|
117
|
+
const encodedTransaction = await encodeTransaction(
|
|
118
|
+
rlpEncodedTransaction,
|
|
119
|
+
signature
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const operation = buildOptimisticOperation(
|
|
123
|
+
account,
|
|
124
|
+
transaction,
|
|
125
|
+
transaction.fees ?? new BigNumber(0)
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
o.next({
|
|
129
|
+
type: "signed",
|
|
130
|
+
signedOperation: {
|
|
131
|
+
operation,
|
|
132
|
+
signature: encodedTransaction.raw,
|
|
133
|
+
expirationDate: null,
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
main().then(
|
|
139
|
+
() => o.complete(),
|
|
140
|
+
(e) => o.error(e)
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
return () => {
|
|
144
|
+
cancelled = true;
|
|
145
|
+
};
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
export default signOperation;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Account } from "../../types";
|
|
2
|
+
import { encodeAccountId } from "../../account";
|
|
3
|
+
import type { GetAccountShape } from "../../bridge/jsHelpers";
|
|
4
|
+
import { makeSync, makeScanAccounts, mergeOps } from "../../bridge/jsHelpers";
|
|
5
|
+
import { getAccountDetails } from "./api";
|
|
6
|
+
|
|
7
|
+
const getAccountShape: GetAccountShape = async (info) => {
|
|
8
|
+
const { address, currency, initialAccount, derivationMode } = info;
|
|
9
|
+
const oldOperations = initialAccount?.operations || [];
|
|
10
|
+
|
|
11
|
+
const accountId = encodeAccountId({
|
|
12
|
+
type: "js",
|
|
13
|
+
version: "2",
|
|
14
|
+
currencyId: currency.id,
|
|
15
|
+
xpubOrAddress: address,
|
|
16
|
+
derivationMode,
|
|
17
|
+
});
|
|
18
|
+
const {
|
|
19
|
+
blockHeight,
|
|
20
|
+
balance,
|
|
21
|
+
spendableBalance,
|
|
22
|
+
operations: newOperations,
|
|
23
|
+
} = await getAccountDetails(address, accountId);
|
|
24
|
+
const operations = mergeOps(oldOperations, newOperations);
|
|
25
|
+
const shape = {
|
|
26
|
+
id: accountId,
|
|
27
|
+
balance,
|
|
28
|
+
spendableBalance,
|
|
29
|
+
operationsCount: operations.length,
|
|
30
|
+
blockHeight,
|
|
31
|
+
};
|
|
32
|
+
return { ...shape, operations };
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const postSync = (_initial: Account, parent: Account) => {
|
|
36
|
+
return parent;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const scanAccounts = makeScanAccounts(getAccountShape);
|
|
40
|
+
export const sync = makeSync(getAccountShape, postSync);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import invariant from "invariant";
|
|
2
|
+
import type { Transaction } from "./types";
|
|
3
|
+
import { getCryptoCurrencyById, parseCurrencyUnit } from "../../currencies";
|
|
4
|
+
import { pickSiblings } from "../../bot/specs";
|
|
5
|
+
import type { AppSpec } from "../../bot/types";
|
|
6
|
+
import { DeviceModelId } from "@ledgerhq/devices";
|
|
7
|
+
|
|
8
|
+
const currency = getCryptoCurrencyById("celo");
|
|
9
|
+
const minimalAmount = parseCurrencyUnit(currency.units[0], "0.001");
|
|
10
|
+
const maxAccount = 3;
|
|
11
|
+
|
|
12
|
+
const celo: AppSpec<Transaction> = {
|
|
13
|
+
name: "Celo",
|
|
14
|
+
currency,
|
|
15
|
+
appQuery: {
|
|
16
|
+
model: DeviceModelId.nanoS,
|
|
17
|
+
appName: "Celo",
|
|
18
|
+
},
|
|
19
|
+
testTimeout: 2 * 60 * 1000,
|
|
20
|
+
mutations: [
|
|
21
|
+
{
|
|
22
|
+
name: "move 50% to another account",
|
|
23
|
+
maxRun: 2,
|
|
24
|
+
transaction: ({ account, siblings, bridge, maxSpendable }) => {
|
|
25
|
+
invariant(maxSpendable.gt(minimalAmount), "balance is too low");
|
|
26
|
+
const sibling = pickSiblings(siblings, maxAccount);
|
|
27
|
+
const recipient = sibling.freshAddress;
|
|
28
|
+
const amount = maxSpendable.div(2).integerValue();
|
|
29
|
+
return {
|
|
30
|
+
transaction: bridge.createTransaction(account),
|
|
31
|
+
updates: [{ recipient }, { amount }],
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "send max to another account",
|
|
37
|
+
maxRun: 1,
|
|
38
|
+
transaction: ({ account, siblings, bridge, maxSpendable }) => {
|
|
39
|
+
invariant(maxSpendable.gt(minimalAmount), "balance is too low");
|
|
40
|
+
const sibling = pickSiblings(siblings, maxAccount);
|
|
41
|
+
const recipient = sibling.freshAddress;
|
|
42
|
+
return {
|
|
43
|
+
transaction: bridge.createTransaction(account),
|
|
44
|
+
updates: [{ recipient }, { useAllAmount: true }],
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default {
|
|
52
|
+
celo,
|
|
53
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { DeviceAction } from "../../bot/types";
|
|
2
|
+
import type { Transaction } from "./types";
|
|
3
|
+
import { deviceActionFlow } from "../../bot/specs";
|
|
4
|
+
import { formatCurrencyUnit } from "../../currencies";
|
|
5
|
+
const acceptTransaction: DeviceAction<Transaction, any> = deviceActionFlow({
|
|
6
|
+
steps: [
|
|
7
|
+
{
|
|
8
|
+
title: "Review",
|
|
9
|
+
button: "Rr",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
title: "Amount",
|
|
13
|
+
button: "Rr",
|
|
14
|
+
expectedValue: ({ account, status }) => {
|
|
15
|
+
const formattedValue =
|
|
16
|
+
"CELO " +
|
|
17
|
+
formatCurrencyUnit(account.unit, status.amount, {
|
|
18
|
+
disableRounding: true,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (!formattedValue.includes(".")) {
|
|
22
|
+
// if the value is pure integer, in the app it will automatically add an .0
|
|
23
|
+
return formattedValue + ".0";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return formattedValue;
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
title: "Address",
|
|
31
|
+
button: "Rr",
|
|
32
|
+
expectedValue: ({ transaction }) => transaction.recipient,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
title: "Max Fees",
|
|
36
|
+
button: "Rr",
|
|
37
|
+
expectedValue: () => "CELO",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
title: "No Gateway Fee",
|
|
41
|
+
button: "Rr",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
title: "Accept",
|
|
45
|
+
button: "LRlr",
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
export default {
|
|
50
|
+
acceptTransaction,
|
|
51
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Transaction, TransactionRaw } from "./types";
|
|
2
|
+
import { BigNumber } from "bignumber.js";
|
|
3
|
+
import {
|
|
4
|
+
fromTransactionCommonRaw,
|
|
5
|
+
toTransactionCommonRaw,
|
|
6
|
+
} from "../../transaction/common";
|
|
7
|
+
import type { Account } from "../../types";
|
|
8
|
+
import { getAccountUnit } from "../../account";
|
|
9
|
+
import { formatCurrencyUnit } from "../../currencies";
|
|
10
|
+
export const formatTransaction = (t: Transaction, account: Account): string => `
|
|
11
|
+
SEND ${formatCurrencyUnit(getAccountUnit(account), t.amount, {
|
|
12
|
+
showCode: true,
|
|
13
|
+
disableRounding: true,
|
|
14
|
+
})}
|
|
15
|
+
TO ${t.recipient}`;
|
|
16
|
+
|
|
17
|
+
const fromTransactionRaw = (tr: TransactionRaw): Transaction => {
|
|
18
|
+
const common = fromTransactionCommonRaw(tr);
|
|
19
|
+
return {
|
|
20
|
+
...common,
|
|
21
|
+
family: tr.family,
|
|
22
|
+
fees: tr.fees ? new BigNumber(tr.fees) : null,
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const toTransactionRaw = (t: Transaction): TransactionRaw => {
|
|
27
|
+
const common = toTransactionCommonRaw(t);
|
|
28
|
+
return {
|
|
29
|
+
...common,
|
|
30
|
+
family: t.family,
|
|
31
|
+
fees: t.fees?.toString() || null,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default {
|
|
36
|
+
formatTransaction,
|
|
37
|
+
fromTransactionRaw,
|
|
38
|
+
toTransactionRaw,
|
|
39
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BigNumber } from "bignumber.js";
|
|
2
|
+
import type {
|
|
3
|
+
TransactionCommon,
|
|
4
|
+
TransactionCommonRaw,
|
|
5
|
+
} from "../../types/transaction";
|
|
6
|
+
|
|
7
|
+
export type Transaction = TransactionCommon & {
|
|
8
|
+
family: "celo";
|
|
9
|
+
fees: BigNumber | null | undefined;
|
|
10
|
+
};
|
|
11
|
+
export type TransactionRaw = TransactionCommonRaw & {
|
|
12
|
+
family: "celo";
|
|
13
|
+
fees: string | null | undefined;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type CoreStatics = Record<string, never>;
|
|
17
|
+
export type CoreAccountSpecifics = Record<string, never>;
|
|
18
|
+
export type CoreOperationSpecifics = Record<string, never>;
|
|
19
|
+
export type CoreCurrencySpecifics = Record<string, never>;
|
|
20
|
+
export const reflect = (_declare: any) => {};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
name: "ethereum seed 1",
|
|
3
|
+
unstableAccounts: true, // FIXME LL-9155
|
|
3
4
|
apdus: `
|
|
4
5
|
=> e00200000d038000002c8000003c80000000
|
|
5
6
|
<= 410469877df9567b58e6ef8f6cf1fb8a8e1bf28a327dee31b183a6b9cd1f3da063af0924506a9912793ef31e41df19f8653fa31bb1fecc32d2e41abdddb22ccb621028373561453661383832363036353137343345356546433033373937313136413335363539663638359000
|
|
@@ -14,6 +14,9 @@ import { prepareTransaction } from "./erc721";
|
|
|
14
14
|
const notOwnedNft = createCustomErrorClass("NotOwnedNft");
|
|
15
15
|
const notEnoughNftOwned = createCustomErrorClass("NotEnoughNftOwned");
|
|
16
16
|
const notTokenIdsProvided = createCustomErrorClass("NotTokenIdsProvided");
|
|
17
|
+
const quantityNeedsToBePositive = createCustomErrorClass(
|
|
18
|
+
"QuantityNeedsToBePositive"
|
|
19
|
+
);
|
|
17
20
|
|
|
18
21
|
export type Modes = "erc1155.transfer";
|
|
19
22
|
|
|
@@ -43,6 +46,12 @@ const erc1155Transfer: ModeModule = {
|
|
|
43
46
|
result.errors.amount = new NotEnoughBalanceInParentAccount();
|
|
44
47
|
}
|
|
45
48
|
|
|
49
|
+
t.quantities?.forEach((quantity) => {
|
|
50
|
+
if (quantity.isLessThan(1)) {
|
|
51
|
+
result.errors.amount = new quantityNeedsToBePositive();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
46
55
|
const enoughTokensOwned: true | Error =
|
|
47
56
|
t.tokenIds?.reduce((acc, tokenId, index) => {
|
|
48
57
|
if (acc instanceof Error) {
|
|
@@ -87,7 +87,7 @@ export const getTransactionParams: CacheRes<
|
|
|
87
87
|
);
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
|
-
* Cache the payment info (fee estimate), with a hash
|
|
90
|
+
* Cache the payment info (fee estimate), with a hash depending on fees-changing transaction params and tx size.
|
|
91
91
|
*
|
|
92
92
|
* @param {Account} arg1.a
|
|
93
93
|
* @param {Transaction} arg1.t
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
import useFeature from "./useFeature";
|
|
4
|
+
import { FeatureId } from "./types";
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
feature: FeatureId;
|
|
8
|
+
fallback?: ReactNode;
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const FeatureToggle = ({
|
|
13
|
+
feature: featureId,
|
|
14
|
+
fallback,
|
|
15
|
+
children,
|
|
16
|
+
}: Props): ReactNode => {
|
|
17
|
+
const feature = useFeature(featureId);
|
|
18
|
+
|
|
19
|
+
if (!feature || !feature.enabled) {
|
|
20
|
+
return fallback;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return children;
|
|
24
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React, {
|
|
2
|
+
createContext,
|
|
3
|
+
ReactNode,
|
|
4
|
+
useContext,
|
|
5
|
+
useEffect,
|
|
6
|
+
useState,
|
|
7
|
+
} from "react";
|
|
8
|
+
|
|
9
|
+
import { FeatureId, Feature } from "./types";
|
|
10
|
+
|
|
11
|
+
type State = {
|
|
12
|
+
getFeature: (_: FeatureId) => Feature | null;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const initialState: State = {
|
|
16
|
+
getFeature: (_) => ({ enabled: false }),
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const FeatureFlagsContext = createContext<State>(initialState);
|
|
20
|
+
|
|
21
|
+
export function useFeatureFlags(): State {
|
|
22
|
+
return useContext<State>(FeatureFlagsContext);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type Props = {
|
|
26
|
+
getFeature: (_: FeatureId) => Feature | null;
|
|
27
|
+
children?: ReactNode;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export function FeatureFlagsProvider({
|
|
31
|
+
getFeature,
|
|
32
|
+
children,
|
|
33
|
+
}: Props): JSX.Element {
|
|
34
|
+
const [state, setState] = useState<State>(initialState);
|
|
35
|
+
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
setState((prev) => ({
|
|
38
|
+
...prev,
|
|
39
|
+
getFeature,
|
|
40
|
+
}));
|
|
41
|
+
}, [getFeature]);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<FeatureFlagsContext.Provider value={state}>
|
|
45
|
+
{children}
|
|
46
|
+
</FeatureFlagsContext.Provider>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type FeatureId = "market"; // Add others with union
|
|
2
|
+
|
|
3
|
+
// We use objects instead of direct booleans for potential future improvements
|
|
4
|
+
// like feature versioning etc
|
|
5
|
+
export type Feature = {
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export type DefaultFeatures = { [key in FeatureId]: Feature };
|
|
@@ -2,6 +2,8 @@ import algorand from "../../families/algorand/bridge/js";
|
|
|
2
2
|
|
|
3
3
|
import bitcoin from "../../families/bitcoin/bridge/js";
|
|
4
4
|
|
|
5
|
+
import celo from "../../families/celo/bridge/js";
|
|
6
|
+
|
|
5
7
|
import crypto_org from "../../families/crypto_org/bridge/js";
|
|
6
8
|
|
|
7
9
|
import elrond from "../../families/elrond/bridge/js";
|
|
@@ -28,6 +30,7 @@ import tron from "../../families/tron/bridge/js";
|
|
|
28
30
|
export default {
|
|
29
31
|
algorand,
|
|
30
32
|
bitcoin,
|
|
33
|
+
celo,
|
|
31
34
|
crypto_org,
|
|
32
35
|
elrond,
|
|
33
36
|
ethereum,
|
|
@@ -2,6 +2,8 @@ import algorand from "../families/algorand/cli-transaction";
|
|
|
2
2
|
|
|
3
3
|
import bitcoin from "../families/bitcoin/cli-transaction";
|
|
4
4
|
|
|
5
|
+
import celo from "../families/celo/cli-transaction";
|
|
6
|
+
|
|
5
7
|
import cosmos from "../families/cosmos/cli-transaction";
|
|
6
8
|
|
|
7
9
|
import crypto_org from "../families/crypto_org/cli-transaction";
|
|
@@ -28,6 +30,7 @@ import tron from "../families/tron/cli-transaction";
|
|
|
28
30
|
export default {
|
|
29
31
|
algorand,
|
|
30
32
|
bitcoin,
|
|
33
|
+
celo,
|
|
31
34
|
cosmos,
|
|
32
35
|
crypto_org,
|
|
33
36
|
elrond,
|
|
@@ -2,6 +2,8 @@ import algorand from "../families/algorand/deviceTransactionConfig";
|
|
|
2
2
|
|
|
3
3
|
import bitcoin from "../families/bitcoin/deviceTransactionConfig";
|
|
4
4
|
|
|
5
|
+
import celo from "../families/celo/deviceTransactionConfig";
|
|
6
|
+
|
|
5
7
|
import cosmos from "../families/cosmos/deviceTransactionConfig";
|
|
6
8
|
|
|
7
9
|
import crypto_org from "../families/crypto_org/deviceTransactionConfig";
|
|
@@ -26,6 +28,7 @@ import tron from "../families/tron/deviceTransactionConfig";
|
|
|
26
28
|
export default {
|
|
27
29
|
algorand,
|
|
28
30
|
bitcoin,
|
|
31
|
+
celo,
|
|
29
32
|
cosmos,
|
|
30
33
|
crypto_org,
|
|
31
34
|
elrond,
|
|
@@ -2,6 +2,8 @@ import algorand from "../families/algorand/hw-getAddress";
|
|
|
2
2
|
|
|
3
3
|
import bitcoin from "../families/bitcoin/hw-getAddress";
|
|
4
4
|
|
|
5
|
+
import celo from "../families/celo/hw-getAddress";
|
|
6
|
+
|
|
5
7
|
import cosmos from "../families/cosmos/hw-getAddress";
|
|
6
8
|
|
|
7
9
|
import crypto_org from "../families/crypto_org/hw-getAddress";
|
|
@@ -30,6 +32,7 @@ import tron from "../families/tron/hw-getAddress";
|
|
|
30
32
|
export default {
|
|
31
33
|
algorand,
|
|
32
34
|
bitcoin,
|
|
35
|
+
celo,
|
|
33
36
|
cosmos,
|
|
34
37
|
crypto_org,
|
|
35
38
|
elrond,
|
package/src/generated/specs.ts
CHANGED
|
@@ -2,6 +2,8 @@ import algorand from "../families/algorand/specs";
|
|
|
2
2
|
|
|
3
3
|
import bitcoin from "../families/bitcoin/specs";
|
|
4
4
|
|
|
5
|
+
import celo from "../families/celo/specs";
|
|
6
|
+
|
|
5
7
|
import cosmos from "../families/cosmos/specs";
|
|
6
8
|
|
|
7
9
|
import crypto_org from "../families/crypto_org/specs";
|
|
@@ -28,6 +30,7 @@ import tron from "../families/tron/specs";
|
|
|
28
30
|
export default {
|
|
29
31
|
algorand,
|
|
30
32
|
bitcoin,
|
|
33
|
+
celo,
|
|
31
34
|
cosmos,
|
|
32
35
|
crypto_org,
|
|
33
36
|
elrond,
|
|
@@ -2,6 +2,8 @@ import algorand from "../families/algorand/speculos-deviceActions";
|
|
|
2
2
|
|
|
3
3
|
import bitcoin from "../families/bitcoin/speculos-deviceActions";
|
|
4
4
|
|
|
5
|
+
import celo from "../families/celo/speculos-deviceActions";
|
|
6
|
+
|
|
5
7
|
import cosmos from "../families/cosmos/speculos-deviceActions";
|
|
6
8
|
|
|
7
9
|
import crypto_org from "../families/crypto_org/speculos-deviceActions";
|
|
@@ -28,6 +30,7 @@ import tron from "../families/tron/speculos-deviceActions";
|
|
|
28
30
|
export default {
|
|
29
31
|
algorand,
|
|
30
32
|
bitcoin,
|
|
33
|
+
celo,
|
|
31
34
|
cosmos,
|
|
32
35
|
crypto_org,
|
|
33
36
|
elrond,
|
|
@@ -2,6 +2,8 @@ import algorand from "../families/algorand/transaction";
|
|
|
2
2
|
|
|
3
3
|
import bitcoin from "../families/bitcoin/transaction";
|
|
4
4
|
|
|
5
|
+
import celo from "../families/celo/transaction";
|
|
6
|
+
|
|
5
7
|
import cosmos from "../families/cosmos/transaction";
|
|
6
8
|
|
|
7
9
|
import crypto_org from "../families/crypto_org/transaction";
|
|
@@ -30,6 +32,7 @@ import tron from "../families/tron/transaction";
|
|
|
30
32
|
export default {
|
|
31
33
|
algorand,
|
|
32
34
|
bitcoin,
|
|
35
|
+
celo,
|
|
33
36
|
cosmos,
|
|
34
37
|
crypto_org,
|
|
35
38
|
elrond,
|