Skip to content

Commit

Permalink
Merge pull request #183 from AElfProject/feature/tg-acceleration
Browse files Browse the repository at this point in the history
feat: verify single guardian and desktop version
  • Loading branch information
aelf-lxy authored Nov 15, 2024
2 parents c77d742 + 71cfe63 commit 2e93f42
Show file tree
Hide file tree
Showing 12 changed files with 211 additions and 164 deletions.
2 changes: 2 additions & 0 deletions packages/base/src/constant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ export const PORTKEY_ORIGIN_CHAIN_ID_KEY = 'PortkeyOriginChainId';
export const PORTKEYAA = 'PortkeyAA';
export const PORTKEY_DISCOVER = 'PortkeyDiscover';
export const DEFAULT_PIN = '111111';
export const IS_MANAGER_READONLY = 'isManagerReadOnly';
export const GUARDIAN_LIST_FOR_LOGIN = 'guardianListForLogin';
6 changes: 3 additions & 3 deletions packages/base/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BaseGuardianItem } from '@portkey/did-ui-react';
import { GuardianApprovedItem } from '@portkey/did-ui-react';
import { IContract, LoginStatusEnum, SendOptions } from '@portkey/types';

export enum WalletStateEnum {
Expand Down Expand Up @@ -53,12 +53,12 @@ export interface ICallContractParams<T> {
args: T;
chainId?: TChainId;
sendOptions?: SendOptions;
approvedGuardians?: BaseGuardianItem[];
guardiansApproved?: GuardianApprovedItem[];
}

export interface ISendOrViewAdapter<T> extends ICallContractParams<T> {
caContract: IContract;
approvedGuardians: ICallContractParams<T>['approvedGuardians'];
guardiansApproved: ICallContractParams<T>['guardiansApproved'];
type?: string;
}

Expand Down
130 changes: 101 additions & 29 deletions packages/bridge/src/bridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
IMultiTransactionParams,
IMultiTransactionResult,
LoginStatusEnum,
IS_MANAGER_READONLY,
} from '@aelf-web-login/wallet-adapter-base';
import {
setWalletInfo,
Expand All @@ -27,18 +28,15 @@ import {
clearLoginError,
setLoginOnChainStatus,
store,
IsManagerReadOnlyStatusEnum,
setIsManagerReadOnlyStatus,
} from './store';
import { CreatePendingInfo, DIDWalletInfo, TelegramPlatform } from '@portkey/did-ui-react';
import { IBaseConfig } from '.';
import {
clearManagerReadonlyStatusInMainChain,
clearManagerReadonlyStatusInSideChain,
EE,
SET_GUARDIAN_APPROVAL_MODAL,
SET_GUARDIAN_APPROVAL_PAYLOAD,
} from './utils';
CreatePendingInfo,
DIDWalletInfo,
getChainInfo,
TelegramPlatform,
} from '@portkey/did-ui-react';
import { IBaseConfig } from '.';
import { EE, SET_GUARDIAN_APPROVAL_MODAL, SET_GUARDIAN_APPROVAL_PAYLOAD } from './utils';

const { isPortkeyApp } = utils;
let isDisconnectClicked = false;
Expand Down Expand Up @@ -175,33 +173,109 @@ class Bridge {
return account;
};

clearManagerReadonlyStatus = async ({
chainIdList,
caHash,
guardiansApproved,
}: {
chainIdList: TChainId[];
caHash: string;
guardiansApproved?: any[];
}) => {
const isManagerReadOnly = enhancedLocalStorage.getItem(IS_MANAGER_READONLY) === 'true';
if ((!guardiansApproved || guardiansApproved.length === 0) && !isManagerReadOnly) {
console.log(
'intg---clearManagerReadonlyStatus invoked by outer,isManagerReadOnly',
isManagerReadOnly,
);
return;
}

try {
await Promise.all(
chainIdList.map(async (chainId) => {
const chainInfo = await getChainInfo(chainId);
const rs = await this.callSendMethod({
chainId,
contractAddress: chainInfo.caContractAddress,
methodName: 'RemoveReadOnlyManager',
args: {
caHash,
guardiansApproved,
},
});
console.log(
'intg---clearManagerReadonlyStatus invoked by self(callSendMethod)',
rs,
chainId,
);
}),
);
} catch (error) {
console.log('intg---execute Promise.all to clearManagerReadonlyStatus error', error);
}
};

callSendMethod = async <T, R>(props: ICallContractParams<T>): Promise<R> => {
if (
!this.activeWallet?.callSendMethod ||
typeof this.activeWallet.callSendMethod !== 'function'
) {
return null as R;
}
const { isManagerReadOnlyStatus } = store.getState();
if (
this.isAAWallet &&
isManagerReadOnlyStatus === IsManagerReadOnlyStatusEnum.TRUE &&
props.methodName !== 'Approve'
) {
const isManagerReadOnly = enhancedLocalStorage.getItem(IS_MANAGER_READONLY) === 'true';
console.log(this.isAAWallet, isManagerReadOnly, props.methodName);
if (this.isAAWallet && isManagerReadOnly && props.methodName !== 'Approve') {
EE.emit(SET_GUARDIAN_APPROVAL_MODAL, true);
const { guardians, caHash, caAddress } = await this.getApprovalModalGuardians();
console.log('intg----getApprovalModalGuardians', guardians, caHash, caAddress);
const rs = await this.activeWallet?.callSendMethod({
...props,
approvedGuardians: guardians,
});
const { guardians } = await this.getApprovalModalGuardians();
const { methodName } = props;
const isRemoveReadOnlyManagerMethod = methodName === 'RemoveReadOnlyManager';

const finalProps = isRemoveReadOnlyManagerMethod
? {
...props,
args: {
...props.args,
guardiansApproved: guardians,
},
}
: props;

console.log('intg---finalProps', finalProps);

const rs = (await this.activeWallet?.callSendMethod({
...finalProps,
guardiansApproved: isRemoveReadOnlyManagerMethod ? [] : guardians,
})) as { error?: any; [key: string]: any };
console.log('intg---rs of callSendMethod', rs);
dispatch(setIsManagerReadOnlyStatus(false));
if (props.chainId === 'AELF') {
clearManagerReadonlyStatusInSideChain(this._sideChainId, caAddress, caHash, guardians);
} else {
clearManagerReadonlyStatusInMainChain(caAddress, caHash, guardians);

if (!rs.error) {
enhancedLocalStorage.setItem(IS_MANAGER_READONLY, false);
if (isRemoveReadOnlyManagerMethod) {
return rs as R;
}
const { walletInfo } = store.getState();
console.log(
'intg----getApprovalModalGuardians',
guardians,
walletInfo?.extraInfo?.portkeyInfo?.caInfo?.caAddress,
walletInfo?.extraInfo?.portkeyInfo?.caInfo?.caHash,
);
if (props.chainId === 'AELF') {
this.clearManagerReadonlyStatus({
chainIdList: [this._sideChainId],
caHash: walletInfo?.extraInfo?.portkeyInfo?.caInfo?.caHash,
guardiansApproved: guardians,
});
} else {
this.clearManagerReadonlyStatus({
chainIdList: ['AELF'],
caHash: walletInfo?.extraInfo?.portkeyInfo?.caInfo?.caHash,
guardiansApproved: guardians,
});
}
}

return rs as R;
} else {
const rs = await this.activeWallet?.callSendMethod(props);
Expand All @@ -211,8 +285,6 @@ class Bridge {

getApprovalModalGuardians = async (): Promise<{
guardians: any[];
caHash: string;
caAddress: string;
}> => {
return new Promise((resolve) => {
EE.once(SET_GUARDIAN_APPROVAL_PAYLOAD, (result) => {
Expand Down
2 changes: 1 addition & 1 deletion packages/bridge/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@ export function initBridge({ baseConfig, wallets, didConfig }: IConfigProps): IB
};
}

export * as PortkeyDid from '@portkey/did-ui-react';
export { GuardianApprovedItem } from '@portkey/did-ui-react';

// export { demoFn } from './ui';
18 changes: 2 additions & 16 deletions packages/bridge/src/store.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,15 @@
import { TWalletError, TWalletInfo, WalletTypeEnum } from '@aelf-web-login/wallet-adapter-base';
import { BaseGuardianItem } from '@portkey/did-ui-react';
import { GuardianApprovedItem } from '@portkey/did-ui-react';
import { LoginStatusEnum } from '@portkey/types';
import { configureStore, createSlice, EnhancedStore } from '@reduxjs/toolkit';

export enum IsManagerReadOnlyStatusEnum {
INIT = 'INIT',
TRUE = 'TRUE',
FALSE = 'FALSE',
}

type TState = {
walletInfo: TWalletInfo;
isLocking: boolean;
walletType: WalletTypeEnum;
loginError: TWalletError | null;
loginOnChainStatus: LoginStatusEnum;
approvedGuardians: BaseGuardianItem[];
isManagerReadOnlyStatus: IsManagerReadOnlyStatusEnum;
approvedGuardians: GuardianApprovedItem[];
};

const initialState: TState = {
Expand All @@ -26,7 +19,6 @@ const initialState: TState = {
loginError: null,
loginOnChainStatus: LoginStatusEnum.INIT,
approvedGuardians: [],
isManagerReadOnlyStatus: IsManagerReadOnlyStatusEnum.INIT,
};

const aelfWebLoginSlice = createSlice({
Expand Down Expand Up @@ -60,11 +52,6 @@ const aelfWebLoginSlice = createSlice({
setApprovedGuardians: (state, action) => {
state.approvedGuardians = action.payload;
},
setIsManagerReadOnlyStatus: (state, action) => {
state.isManagerReadOnlyStatus = action.payload
? IsManagerReadOnlyStatusEnum.TRUE
: IsManagerReadOnlyStatusEnum.FALSE;
},
},
});

Expand Down Expand Up @@ -106,7 +93,6 @@ export const {
clearLoginError,
setLoginOnChainStatus,
setApprovedGuardians,
setIsManagerReadOnlyStatus,
} = aelfWebLoginSlice.actions;

export type AppDispatch = typeof store.dispatch;
Expand Down
30 changes: 14 additions & 16 deletions packages/bridge/src/ui.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
enhancedLocalStorage,
PORTKEYAA,
OperationTypeEnum,
GUARDIAN_LIST_FOR_LOGIN,
} from '@aelf-web-login/wallet-adapter-base';
import { Bridge } from './bridge';
import {
Expand Down Expand Up @@ -235,22 +236,19 @@ const SignInModal: React.FC<ISignInModalProps> = (props: ISignInModalProps) => {
const [isWrongPassword, setIsWrongPassword] = useState(false);
const [isShowConfirmLogoutPanel, setIsShowConfirmLogoutPanel] = useState(false);
const [isShowNestedModal, setIsShowNestedModal] = useState(false);
const {
handleTelegram,
currentLifeCircle,
guardianList,
caHash,
originChainId,
onTGSignInApprovalSuccess,
} = useTelegram(
baseConfig.enableAcceleration,
baseConfig.defaultPin,
baseConfig.chainId,
baseConfig.networkType,
bridgeInstance,
setIsShowWrapper,
EE,
);
const { handleTelegram, currentLifeCircle, caHash, originChainId, onTGSignInApprovalSuccess } =
useTelegram(
baseConfig.enableAcceleration,
baseConfig.defaultPin,
baseConfig.chainId,
baseConfig.networkType,
bridgeInstance,
setIsShowWrapper,
EE,
);

const guardianList = JSON.parse(enhancedLocalStorage.getItem(GUARDIAN_LIST_FOR_LOGIN) || '[]');

const filteredWallets = wallets.filter((ele) => ele.name !== PORTKEYAA);
const isMobileDevice = isMobile();
const {
Expand Down
Loading

0 comments on commit 2e93f42

Please sign in to comment.