Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Bump @metamask/keyring-controller to v6.0.0 #6770

Closed
wants to merge 88 commits into from
Closed
Show file tree
Hide file tree
Changes from 80 commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
421e927
Update mnemonic util methods
gantunesr Jul 8, 2023
3b041db
Update logic to retrieve mnemonic from KeyringController
gantunesr Jul 8, 2023
22cb90f
Add resolution for @ethereumjs/util
gantunesr Jul 8, 2023
b8b5c38
Add @metamask/scure-bip39 module
gantunesr Jul 8, 2023
305ae13
Bump KeyringController to v5.0.0
gantunesr Jul 8, 2023
5aff774
Sort package.json
gantunesr Jul 8, 2023
6e2cc79
Update yarn.lock
gantunesr Jul 8, 2023
a7db848
Update import in ManualBackupStep2
gantunesr Jul 8, 2023
93c6198
Update KeyringController patch
gantunesr Jul 9, 2023
d70fe34
Merge branch 'main' of https://github.com/MetaMask/metamask-mobile in…
gantunesr Jul 9, 2023
dec343b
Delete patch
gantunesr Jul 10, 2023
eaa1498
Bump keyring-controller to v6.0.0 and controller-utils to v3.3.0
gantunesr Jul 10, 2023
b526a3c
Update keyring-controller constructor
gantunesr Jul 10, 2023
9420c47
Fix BaseControllerV2 change
gantunesr Jul 10, 2023
cd650cd
Add @metamask/eth-keyring-controller
gantunesr Jul 12, 2023
5b7805d
Add @metamask/eth-keyring-controller to declarations
gantunesr Jul 12, 2023
c4269aa
Add QRHardwareKeyring builder
gantunesr Jul 12, 2023
c562daf
Subscribe to lock and unlock
gantunesr Jul 12, 2023
5c5dfac
Fix exportSeedPhrase breaking change
gantunesr Jul 12, 2023
75118fb
Update event subscription
gantunesr Jul 12, 2023
ec8e3d5
Merge main
gantunesr Jul 12, 2023
5677acd
Merge main
gantunesr Jul 13, 2023
9034bb5
Update yarn.lock
gantunesr Jul 13, 2023
49d2b0f
Add temporary solution to BackgroundBridge
gantunesr Jul 13, 2023
fac6d8e
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Jul 13, 2023
ed68cb5
Merge main
gantunesr Jul 24, 2023
6e9b500
Lint
gantunesr Jul 24, 2023
7beb9c2
Add fix for initial engine state and fixture
gantunesr Jul 24, 2023
b176223
Modify password logic in reveal credentials
gantunesr Jul 24, 2023
9a9c5ca
Remove fixture fix
gantunesr Jul 26, 2023
dfec3a0
Update fixture
gantunesr Jul 26, 2023
674e3cd
Update KeyringController constructor
gantunesr Jul 26, 2023
b2e071c
Merge main
gantunesr Jul 26, 2023
50285e1
Update app/core/BackgroundBridge/BackgroundBridge.js
gantunesr Jul 27, 2023
bf4c22c
Remove getSeedPhrase from ResetPassword
gantunesr Jul 27, 2023
6ea9407
Update uint8ArrayToMnemonic method
gantunesr Jul 27, 2023
223f956
Update uint8ArrayToMnemonic method - Add trimEnd
gantunesr Jul 27, 2023
338725c
Merge branch 'bump-keyring-controller-v6' of https://github.com/MetaM…
gantunesr Jul 27, 2023
9ba2624
Update controller subscription to bind method
gantunesr Jul 27, 2023
6caf6d3
Remove try-catch temporal fix
gantunesr Jul 27, 2023
06c1588
Update Keyring builder pattern
gantunesr Jul 27, 2023
d6f4a2f
Remove @metamask/eth-keyring-controller
gantunesr Jul 27, 2023
0e8418a
Change state parameter pattern
gantunesr Jul 27, 2023
d21d975
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Jul 27, 2023
2e319d3
Remove unused value
gantunesr Jul 28, 2023
1b26b15
Lint
gantunesr Jul 28, 2023
1fccf7c
Update engine fixture
gantunesr Jul 28, 2023
c9a1bcb
Merge branch 'bump-keyring-controller-v6' of https://github.com/MetaM…
gantunesr Jul 28, 2023
03a941d
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Jul 28, 2023
6ffc9f6
fix: Unlocking QR wallet accounts
gantunesr Jul 28, 2023
1020e42
lint: Remove unused object
gantunesr Jul 28, 2023
f06c323
Add patch to @metamask/keyring-controller
gantunesr Jul 28, 2023
3238117
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Jul 28, 2023
c11b51f
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Jul 28, 2023
35d4f85
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Jul 29, 2023
f183d17
Merge branch 'main' of https://github.com/MetaMask/metamask-mobile in…
gantunesr Aug 2, 2023
985f9c2
Merge branch 'main' of https://github.com/MetaMask/metamask-mobile in…
gantunesr Aug 16, 2023
ba7e726
Remove @metamask/eth-keyring-controller module declaration
gantunesr Aug 16, 2023
65409dc
Update data type in state subscription
gantunesr Aug 16, 2023
ebbeec2
Remove comment to ignore error
gantunesr Aug 16, 2023
e5148b2
Update method uint8ArrayToMnemonic and fix test
gantunesr Aug 16, 2023
247a064
lint
gantunesr Aug 16, 2023
0531c2b
Solve merge conflicts
gantunesr Aug 16, 2023
43cc8f0
Solve conflicts
gantunesr Sep 12, 2023
2cf0a88
chore: update @metamask/keyring-controller patch
gantunesr Sep 12, 2023
6c8dd3a
fix: add caret to @metamask/gas-fee-controller package version
gantunesr Sep 12, 2023
4335f0f
chore: patch micro-ftch to ignore zlib import in node context
gantunesr Sep 12, 2023
ca30637
chore: remove @ethereumjs/util resolution
gantunesr Sep 12, 2023
3bab33b
chore: remove @ethereumjs/util resolution - yarn.lock update
gantunesr Sep 12, 2023
3c92886
chore: update lavamoat allowscripts to include @keystonehq modules
gantunesr Sep 12, 2023
64d6983
chore: update @metamask/message-manager
gantunesr Sep 12, 2023
abde5e6
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Sep 12, 2023
d8389a5
chore: update message-manager patch 7.0.1 and remove patch 1.0.1
gantunesr Sep 12, 2023
c47bb45
chore: update message-manager patch 7.0.1 and remove patch 1.0.1
gantunesr Sep 12, 2023
0f77e28
chore: lint
gantunesr Sep 12, 2023
0b96057
chore: lint
gantunesr Sep 12, 2023
0916423
chore: update @metamask/keyring-controller patch to modify PersonalMe…
gantunesr Sep 12, 2023
a116bfd
fix: keyring-controller construction
gantunesr Sep 15, 2023
d8f8565
chore: add KeyringController actions and events to global constraints
gantunesr Sep 15, 2023
ad7e29e
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Sep 15, 2023
38bacfd
refactor: use passwordRequirementsMet as requiment to enable CTA
gantunesr Sep 16, 2023
63965dc
chore: add comment to micro-ftch patch to explain its purpose
gantunesr Sep 16, 2023
279c270
fix: add missing updateIdentities call in keyring-controller patch
gantunesr Sep 17, 2023
6c4b74d
chore: add information comment to keyring-controller patch
gantunesr Sep 17, 2023
61781ff
chore: add information comment to message manager patch inside the ke…
gantunesr Sep 17, 2023
39464bc
Merge branch 'bump-keyring-controller-v6' of https://github.com/MetaM…
gantunesr Sep 17, 2023
0a506a8
fix: typo in @metamask/keyring-controller/@metamask/message-manager
gantunesr Sep 17, 2023
488b737
Merge branch 'main' into bump-keyring-controller-v6
gantunesr Sep 17, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions app/components/Views/ChoosePassword/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -551,10 +551,7 @@ class ChoosePassword extends PureComponent {
const { KeyringController } = Engine.context;
const { password } = this.state;
const keychainPassword = this.keyringControllerPasswordSet ? password : '';
const mnemonic = await KeyringController.exportSeedPhrase(
keychainPassword,
).toString();
return JSON.stringify(mnemonic).replace(/"/g, '');
return await KeyringController.exportSeedPhrase(keychainPassword);
gantunesr marked this conversation as resolved.
Show resolved Hide resolved
};

jumpToConfirmPassword = () => {
Expand Down
7 changes: 1 addition & 6 deletions app/components/Views/ConnectQRHardware/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -252,17 +252,12 @@ const ConnectQRHardware = ({ navigation }: IConnectQRHardwareProps) => {
);

const onUnlock = useCallback(async () => {
const { PreferencesController } = Engine.context as any;
resetError();
setBlockingModalVisible(true);
const importedAccountAddresses = [];
try {
for (const account of checkedAccounts) {
const accountAddress =
await KeyringController.unlockQRHardwareWalletAccount(account);
importedAccountAddresses.push(accountAddress);
await KeyringController.unlockQRHardwareWalletAccount(account);
}
PreferencesController.setSelectedAddress(importedAccountAddresses[0]);
Gudahtt marked this conversation as resolved.
Show resolved Hide resolved
} catch (err) {
Logger.log('Error: Connecting QR hardware wallet', err);
}
Expand Down
8 changes: 5 additions & 3 deletions app/components/Views/ManualBackupStep1/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { connect } from 'react-redux';
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
import FeatherIcons from 'react-native-vector-icons/Feather';
import { BlurView } from '@react-native-community/blur';
import { wordlist } from '@metamask/scure-bip39/dist/wordlists/english';
import { baseStyles } from '../../../styles/common';
import StyledButton from '../../UI/StyledButton';
import OnboardingProgress from '../../UI/OnboardingProgress';
Expand All @@ -29,6 +30,7 @@ import {
WRONG_PASSWORD_ERROR,
} from '../../../constants/onboarding';
import { useTheme } from '../../../util/theme';
import { uint8ArrayToMnemonic } from '../../../util/mnemonic';
import { createStyles } from './styles';

import { CONFIRM_CHANGE_PASSWORD_INPUT_BOX_ID } from '../../../constants/test-ids';
Expand Down Expand Up @@ -63,10 +65,10 @@ const ManualBackupStep1 = ({ route, navigation, appTheme }) => {

const tryExportSeedPhrase = async (password) => {
const { KeyringController } = Engine.context;
const mnemonic = await KeyringController.exportSeedPhrase(
const uint8ArrayMnemonic = await KeyringController.exportSeedPhrase(
password,
).toString();
return JSON.stringify(mnemonic).replace(/"/g, '').split(' ');
);
return uint8ArrayToMnemonic(uint8ArrayMnemonic, wordlist).split(' ');
};

useEffect(() => {
Expand Down
4 changes: 2 additions & 2 deletions app/components/Views/ManualBackupStep2/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { connect } from 'react-redux';
import { seedphraseBackedUp } from '../../../actions/user';
import MaterialIcon from 'react-native-vector-icons/MaterialCommunityIcons';
import { getOnboardingNavbarOptions } from '../../UI/Navbar';
import { shuffle, compareSRPs } from '../../../util/SRP';
import { shuffle, compareMnemonics } from '../../../util/mnemonic';
import { MetaMetricsEvents } from '../../../core/Analytics';
import AnalyticsV2 from '../../../util/analyticsV2';
import { useTheme } from '../../../util/theme';
Expand Down Expand Up @@ -120,7 +120,7 @@ const ManualBackupStep2 = ({ navigation, seedphraseBackedUp, route }) => {
(confirmedWord) => confirmedWord.word,
);

return compareSRPs(validWords, proposedWords);
return compareMnemonics(validWords, proposedWords);
}, [confirmedWords, route.params?.words]);

const goNext = () => {
Expand Down
15 changes: 0 additions & 15 deletions app/components/Views/ResetPassword/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -461,21 +461,6 @@ class ResetPassword extends PureComponent {
);
};

/**
* Returns current vault seed phrase
* It does it using an empty password or a password set by the user
* depending on the state the app is currently in
*/
getSeedPhrase = async () => {
const { KeyringController } = Engine.context;
const { originalPassword } = this.state;
const keychainPassword = originalPassword;
const mnemonic = await KeyringController.exportSeedPhrase(
gantunesr marked this conversation as resolved.
Show resolved Hide resolved
keychainPassword,
).toString();
return JSON.stringify(mnemonic).replace(/"/g, '');
};

jumpToConfirmPassword = () => {
const { current } = this.confirmPasswordInput;
current && current.focus();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ import {
View,
} from 'react-native';
import { useDispatch, useSelector } from 'react-redux';
import AsyncStorage from '../../../store/async-storage-wrapper';
import { wordlist } from '@metamask/scure-bip39/dist/wordlists/english';
import QRCode from 'react-native-qrcode-svg';
import ScrollableTabView, {
DefaultTabBar,
} from 'react-native-scrollable-tab-view';
const CustomTabView = View as any;
import Icon from 'react-native-vector-icons/FontAwesome5';
import AsyncStorage from '../../../store/async-storage-wrapper';
import ActionView from '../../UI/ActionView';
import ButtonReveal from '../../UI/ButtonReveal';
import Button, {
Expand All @@ -39,6 +40,7 @@ import Engine from '../../../core/Engine';
import { BIOMETRY_CHOICE } from '../../../constants/storage';
import { MetaMetricsEvents } from '../../../core/Analytics';
import AnalyticsV2 from '../../../util/analyticsV2';
import { uint8ArrayToMnemonic } from '../../../util/mnemonic';
import { Authentication } from '../../../core/';

import Device from '../../../util/device';
Expand Down Expand Up @@ -123,10 +125,8 @@ const RevealPrivateCredential = ({
try {
let privateCredential;
if (!isPrivateKeyReveal) {
const mnemonic = await KeyringController.exportSeedPhrase(
pswd,
).toString();
privateCredential = JSON.stringify(mnemonic).replace(/"/g, '');
const uint8ArraySeed = await KeyringController.exportSeedPhrase(pswd);
privateCredential = uint8ArrayToMnemonic(uint8ArraySeed, wordlist);
} else {
privateCredential = await KeyringController.exportAccount(
pswd,
Expand Down Expand Up @@ -204,20 +204,23 @@ const RevealPrivateCredential = ({
navigateBack();
};

const tryUnlock = () => {
const tryUnlock = async () => {
const { KeyringController } = Engine.context as any;
if (KeyringController.validatePassword(password)) {
if (!isPrivateKey) {
const currentDate = new Date();
dispatch(recordSRPRevealTimestamp(currentDate.toString()));
AnalyticsV2.trackEvent(MetaMetricsEvents.NEXT_REVEAL_SRP_CTA, {});
}
setIsModalVisible(true);
setWarningIncorrectPassword('');
} else {
try {
await KeyringController.verifyPassword(password);
} catch {
const msg = strings('reveal_credential.warning_incorrect_password');
setWarningIncorrectPassword(msg);
return;
}

if (!isPrivateKey) {
const currentDate = new Date();
dispatch(recordSRPRevealTimestamp(currentDate.toString()));
AnalyticsV2.trackEvent(MetaMetricsEvents.NEXT_REVEAL_SRP_CTA, {});
}
setIsModalVisible(true);
setWarningIncorrectPassword('');
};

const onPasswordChange = (pswd: string) => {
Expand Down Expand Up @@ -410,11 +413,6 @@ const RevealPrivateCredential = ({
setIsModalVisible(false);
};

const enableNextButton = () => {
const { KeyringController } = Engine.context as any;
return KeyringController.validatePassword(password);
};

const renderModal = (
isPrivateKeyReveal: boolean,
privCredentialName: string,
Expand Down Expand Up @@ -533,7 +531,7 @@ const RevealPrivateCredential = ({
onCancelPress={unlocked ? done : cancelReveal}
onConfirmPress={() => tryUnlock()}
showConfirmButton={!unlocked}
confirmDisabled={!enableNextButton()}
confirmDisabled={password.length < 8}
Gudahtt marked this conversation as resolved.
Show resolved Hide resolved
cancelTestID={SECRET_RECOVERY_PHRASE_CANCEL_BUTTON_ID}
confirmTestID={SECRET_RECOVERY_PHRASE_NEXT_BUTTON_ID}
>
Expand Down
1 change: 1 addition & 0 deletions app/core/AppConstants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ export default {
CANCEL_RATE: 'Transactions (Cancel)',
SPEED_UP_RATE: 'Transactions (Speed Up)',
NETWORK_STATE_CHANGE_EVENT: 'NetworkController:stateChange',
KEYRING_STATE_CHANGE_EVENT: 'KeyringController:stateChange',
ETH_SIGN_ERROR: 'eth_sign requires 32 byte message hash',
TERMS_OF_USE: {
TERMS_DISPLAYED: 'ToU Displayed',
Expand Down
10 changes: 8 additions & 2 deletions app/core/BackgroundBridge/BackgroundBridge.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,14 @@ export class BackgroundBridge extends EventEmitter {
);
Engine.context.PreferencesController.subscribe(this.sendStateUpdate);

Engine.context.KeyringController.onLock(this.onLock.bind(this));
Engine.context.KeyringController.onUnlock(this.onUnlock.bind(this));
Engine.controllerMessenger.subscribe(
'KeyringController:lock',
this.onLock.bind(this),
);
Engine.controllerMessenger.subscribe(
'KeyringController:unlock',
this.onUnlock.bind(this),
);

this.on('update', this.onStateUpdate);

Expand Down
4 changes: 2 additions & 2 deletions app/core/BackupVault/backupVault.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { KeyringState } from '@metamask/keyring-controller';
import { KeyringControllerState } from '@metamask/keyring-controller';
import Logger from '../../util/Logger';
import {
getInternetCredentials,
Expand Down Expand Up @@ -35,7 +35,7 @@ interface KeyringBackupResponse {
}
*/
export async function backupVault(
keyringState: KeyringState,
keyringState: KeyringControllerState,
): Promise<KeyringBackupResponse> {
if (keyringState.vault) {
const backupResult = await setInternetCredentials(
Expand Down
99 changes: 56 additions & 43 deletions app/core/Engine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@ import { BaseState, ControllerMessenger } from '@metamask/base-controller';
import { ComposableController } from '@metamask/composable-controller';
import {
KeyringController,
KeyringState,
SignTypedDataVersion,
KeyringControllerState,
KeyringControllerActions,
KeyringControllerEvents,
} from '@metamask/keyring-controller';
import {
NetworkController,
Expand Down Expand Up @@ -125,15 +127,17 @@ type GlobalActions =
| GetTokenListState
| NetworkControllerActions
| PermissionControllerActions
| SignatureControllerActions;
| SignatureControllerActions
| KeyringControllerActions;
type GlobalEvents =
| ApprovalControllerEvents
| CurrencyRateStateChange
| GasFeeStateChange
| TokenListStateChange
| NetworkControllerEvents
| PermissionControllerEvents
| SignatureControllerEvents;
| SignatureControllerEvents
| KeyringControllerEvents;

type PermissionsByRpcMethod = ReturnType<typeof getPermissionSpecifications>;
type Permissions = PermissionsByRpcMethod[keyof PermissionsByRpcMethod];
Expand All @@ -145,7 +149,7 @@ export interface EngineState {
NftController: NftState;
TokenListController: TokenListState;
CurrencyRateController: CurrencyRateState;
KeyringController: KeyringState;
KeyringController: KeyringControllerState;
NetworkController: NetworkState;
PreferencesController: PreferencesState;
PhishingController: PhishingState;
Expand Down Expand Up @@ -221,7 +225,7 @@ class Engine {
// eslint-disable-next-line @typescript-eslint/default-param-last
constructor(
initialState: Partial<EngineState> = {},
initialKeyringState?: KeyringState | null,
initialKeyringState?: KeyringControllerState | null,
) {
this.controllerMessenger = new ControllerMessenger();

Expand Down Expand Up @@ -391,8 +395,6 @@ class Engine {
const phishingController = new PhishingController();
phishingController.maybeUpdateState();

const additionalKeyrings = [QRHardwareKeyring];

const getIdentities = () => {
const identities = preferencesController.state.identities;
const lowerCasedIdentities: PreferencesState['identities'] = {};
Expand All @@ -402,29 +404,40 @@ class Engine {
return lowerCasedIdentities;
};

const keyringState = initialKeyringState || initialState.KeyringController;
const qrKeyringBuilder = () => new QRHardwareKeyring();
qrKeyringBuilder.type = QRHardwareKeyring.type;

const keyringController = new KeyringController(
{
removeIdentity: preferencesController.removeIdentity.bind(
preferencesController,
),
syncIdentities: preferencesController.syncIdentities.bind(
preferencesController,
),
updateIdentities: preferencesController.updateIdentities.bind(
preferencesController,
),
setSelectedAddress: preferencesController.setSelectedAddress.bind(
preferencesController,
),
setAccountLabel: preferencesController.setAccountLabel.bind(
preferencesController,
),
},
{ encryptor, keyringTypes: additionalKeyrings },
keyringState,
);
const keyringController = new KeyringController({
removeIdentity: preferencesController.removeIdentity.bind(
preferencesController,
),
syncIdentities: preferencesController.syncIdentities.bind(
preferencesController,
),
updateIdentities: preferencesController.updateIdentities.bind(
preferencesController,
),
setSelectedAddress: preferencesController.setSelectedAddress.bind(
preferencesController,
),
setAccountLabel: preferencesController.setAccountLabel.bind(
preferencesController,
),
encryptor,
// @ts-expect-error Error might be caused by base controller version mismatch
messenger: this.controllerMessenger.getRestricted({
name: 'KeyringController',
allowedEvents: [
'KeyringController:lock',
'KeyringController:unlock',
'KeyringController:stateChange',
'KeyringController:accountRemoved',
],
allowedActions: ['KeyringController:getState'],
}),
state: initialKeyringState || initialState.KeyringController,
keyringBuilders: [qrKeyringBuilder],
});

const controllers = [
keyringController,
Expand Down Expand Up @@ -618,7 +631,6 @@ class Engine {
keyringController.signPersonalMessage.bind(keyringController),
signTypedMessage: (msgParams, { version }) =>
keyringController.signTypedMessage(
// @ts-expect-error Error might be caused by base controller version mismatch
msgParams,
version as SignTypedDataVersion,
),
Expand Down Expand Up @@ -729,19 +741,20 @@ class Engine {
}

handleVaultBackup() {
const { KeyringController } = this.context;
KeyringController.subscribe((state: any) =>
backupVault(state)
.then((result) => {
if (result.success) {
Logger.log('Engine', 'Vault back up successful');
} else {
Logger.log('Engine', 'Vault backup failed', result.error);
}
})
.catch((error) => {
Logger.error(error, 'Engine Vault backup failed');
}),
this.controllerMessenger.subscribe(
AppConstants.KEYRING_STATE_CHANGE_EVENT,
(state: KeyringControllerState) =>
backupVault(state)
.then((result) => {
if (result.success) {
Logger.log('Engine', 'Vault back up successful');
} else {
Logger.log('Engine', 'Vault backup failed', result.error);
}
})
.catch((error) => {
Logger.error(error, 'Engine Vault backup failed');
}),
);
}

Expand Down
Loading