/*-
*
* Hedera Identify Snap
*
* Copyright (C) 2024 Hedera Hashgraph, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import { rpcErrors } from '@metamask/rpc-errors';
import type {
OnHomePageHandler,
OnInstallHandler,
OnRpcRequestHandler,
OnUpdateHandler,
OnUserInputHandler,
} from '@metamask/snaps-sdk';
import _ from 'lodash';
import { HelloUI } from './components/hello';
import { ShowAccountPrivateKeyUI } from './components/showAccountPrivateKey';
import { OnHomePageUI } from './custom-ui/onHome';
import { onInstallUI } from './custom-ui/onInstall';
import { onUpdateUI } from './custom-ui/onUpdate';
import { onUserInputUI } from './custom-ui/onUserInput';
import { ResolveDIDFacade } from './facades/did/ResolveDIDFacade';
import { SwitchDIDMethodFacade } from './facades/did/SwitchDIDMethodFacade';
import { ConfigureGAccountFacde } from './facades/gdrive/ConfigureGAccountFacade';
import { SyncVCsInGDriveFacade } from './facades/gdrive/SyncVCsInGDriveFacade';
import { GetAccountInfoFacade } from './facades/snap/GetAccountInfoFacade';
import { TogglePopupsFacade } from './facades/snap/TogglePopupsFacade';
import { GetVCsFacade } from './facades/vc/GetVCsFacade';
import { RemoveVCsFacade } from './facades/vc/RemoveVCsFacade';
import { SaveVCFacade } from './facades/vc/SaveVCFacade';
import { VerifyVCFacade } from './facades/vc/VerifyVCFacade';
import { CreateVPFacade } from './facades/vp/CreateVPFacade';
import { VerifyVPFacade } from './facades/vp/VerifyVPFacade';
import { SnapAccounts } from './snap/SnapAccounts';
import { SnapState } from './snap/SnapState';
import { availableMethods, availableProofFormats } from './types/constants';
import type { IdentifySnapParams } from './types/state';
import { EvmUtils } from './utils/EvmUtils';
import { ParamUtils } from './utils/ParamUtils';
/**
* Handle incoming JSON-RPC requests, sent through `wallet_invokeSnap`.
* @param args - The request handler args as object.
* @param args.origin - The origin of the request, e.g., the website that
* invoked the snap.
* @param args.request - A validated JSON-RPC request object.
* @returns The result of `snap_dialog`.
* @throws If the request method is not valid for this snap.
*/
export const onRpcRequest: OnRpcRequestHandler = async ({
origin,
request,
}) => {
console.log('Request:', JSON.stringify(request, null, 4));
console.log('Origin:', origin);
console.log('-------------------------------------------------------------');
let state = await SnapState.getStateUnchecked();
if (_.isEmpty(state)) {
state = await SnapState.initState();
}
const identifySnapParams: IdentifySnapParams = {
origin,
state,
};
// Get network
const network = await EvmUtils.getChainId();
switch (request.method) {
case 'hello': {
return await snap.request({
method: 'snap_dialog',
params: {
type: 'alert',
content: ,
},
});
}
case 'togglePopups': {
return await TogglePopupsFacade.togglePopups(identifySnapParams);
}
case 'switchDIDMethod': {
ParamUtils.isValidSwitchMethodRequest(request.params);
return await SwitchDIDMethodFacade.switchDIDMethod(
identifySnapParams,
request.params.didMethod,
);
}
}
let isExternalAccount = false;
if (ParamUtils.isExternalAccountFlagSet(request.params)) {
isExternalAccount = true;
}
// Set current account
await SnapAccounts.setCurrentAccount(
origin,
state,
request.params,
network,
isExternalAccount,
);
const accountInfoPublic =
await GetAccountInfoFacade.getAccountInfo(identifySnapParams);
switch (request.method) {
case 'getAccountInfo':
return {
currentAccount: accountInfoPublic,
};
case 'showAccountPrivateKey':
await snap.request({
method: 'snap_dialog',
params: {
type: 'alert',
content: (
),
},
});
return {
currentAccount: accountInfoPublic,
};
case 'resolveDID': {
ParamUtils.isValidResolveDIDRequest(request.params);
return await ResolveDIDFacade.resolveDID(
identifySnapParams,
request.params.did,
);
}
case 'getVCs': {
ParamUtils.isValidGetVCsRequest(request.params);
return await GetVCsFacade.getVCs(identifySnapParams, request.params);
}
case 'createVC': {
ParamUtils.isValidCreateVCRequest(request.params);
return await SaveVCFacade.createVC(identifySnapParams, request.params);
}
case 'saveVC': {
ParamUtils.isValidSaveVCRequest(request.params);
return await SaveVCFacade.saveVC(identifySnapParams, request.params);
}
case 'verifyVC': {
ParamUtils.isValidVerifyVCRequest(request.params);
return await VerifyVCFacade.verifyVC(
identifySnapParams,
request.params.verifiableCredential,
);
}
case 'removeVC': {
ParamUtils.isValidRemoveVCRequest(request.params);
return await RemoveVCsFacade.removeSpecificVC(
identifySnapParams,
request.params,
);
}
case 'deleteAllVCs': {
ParamUtils.isValidDeleteAllVCsRequest(request.params);
return await RemoveVCsFacade.removeAllVCs(
identifySnapParams,
request.params,
);
}
case 'createVP': {
ParamUtils.isValidCreateVPRequest(request.params);
return await CreateVPFacade.createVP(identifySnapParams, request.params);
}
case 'verifyVP': {
ParamUtils.isValidVerifyVPRequest(request.params);
return await VerifyVPFacade.verifyVP(
identifySnapParams,
request.params.verifiablePresentation,
);
}
case 'getAvailableMethods': {
return availableMethods.map((key) => key);
}
case 'getCurrentDIDMethod': {
return state.snapConfig.dApp.didMethod;
}
case 'getSupportedProofFormats': {
return availableProofFormats.map((key) => key);
}
case 'configureGoogleAccount': {
ParamUtils.isValidConfigueGoogleRequest(request.params);
return await ConfigureGAccountFacde.configureGoogleAccount(
identifySnapParams,
request.params,
);
}
case 'syncGoogleVCs': {
return await SyncVCsInGDriveFacade.syncVCsBetweenSnapAndGDrive(
identifySnapParams,
);
}
default:
// Throw a known error to avoid crashing the Snap
throw rpcErrors.methodNotFound(request.method);
}
};
export const onHomePage: OnHomePageHandler = OnHomePageUI;
export const onUserInput: OnUserInputHandler = onUserInputUI;
export const onInstall: OnInstallHandler = onInstallUI;
export const onUpdate: OnUpdateHandler = onUpdateUI;