safe-apps-sdk
Version:
SDK developed to integrate third-party apps with Safe app.
34 lines (23 loc) • 1.23 kB
text/typescript
import { Methods } from '../communication';
import { Safe } from '../safe';
import { Wallet } from '../wallet';
import { Permission, PermissionsError, PERMISSIONS_REQUEST_REJECTED } from '../types/permissions';
const hasPermission = (required: Methods, permissions: Permission[]): boolean =>
permissions.some((permission) => permission.parentCapability === required);
const requirePermission = () => (_: unknown, propertyKey: string, descriptor: PropertyDescriptor) => {
const originalMethod = descriptor.value;
descriptor.value = async function () {
// @ts-expect-error accessing private property from decorator. 'this' context is the class instance
const wallet = new Wallet((this as Safe).communicator);
let currentPermissions = await wallet.getPermissions();
if (!hasPermission(propertyKey as Methods, currentPermissions)) {
currentPermissions = await wallet.requestPermissions([{ [propertyKey as Methods]: {} }]);
}
if (!hasPermission(propertyKey as Methods, currentPermissions)) {
throw new PermissionsError('Permissions rejected', PERMISSIONS_REQUEST_REJECTED);
}
return originalMethod.apply(this);
};
return descriptor;
};
export default requirePermission;