Skip to content

Commit

Permalink
feat: apply the adena-wallet-sdk response type (#594)
Browse files Browse the repository at this point in the history
  • Loading branch information
jinoosss authored Oct 16, 2024
1 parent 6c5ca2f commit cb15871
Show file tree
Hide file tree
Showing 26 changed files with 1,047 additions and 488 deletions.
1 change: 1 addition & 0 deletions packages/adena-extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
"webpack-merge": "^5.10.0"
},
"dependencies": {
"@adena-wallet/sdk": "^0.0.1",
"@gnolang/gno-js-client": "1.3.0",
"@gnolang/tm2-js-client": "1.2.1",
"@tanstack/react-query": "^4.36.1",
Expand Down
33 changes: 21 additions & 12 deletions packages/adena-extension/src/inject.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
import { WalletResponse } from '@adena-wallet/sdk';
import manifest from '@public/manifest.json';

import { EVENT_KEYS } from '@common/constants/event-key.constant';

import { AdenaExecutor } from './inject/executor/executor';
import {
AdenaExecutor,
RequestAddedNetworkMessage,
RequestDoContractMessage,
} from './inject/executor/executor';
import manifest from '@public/manifest.json';
AddEstablishResponse,
AddNetworkParams,
AddNetworkResponse,
DoContractResponse,
GetAccountResponse,
SignTxResponse,
SwitchNetworkResponse,
TransactionParams,
} from './inject/types';

function callbackCustomEvent<T>(event: CustomEvent<T>, callback: (message: T) => void): void {
event.stopImmediatePropagation();
Expand All @@ -14,37 +23,37 @@ function callbackCustomEvent<T>(event: CustomEvent<T>, callback: (message: T) =>
const init = (): void => {
const adena = {
version: manifest.version,
async AddEstablish(name: string): Promise<unknown> {
async AddEstablish(name: string): Promise<AddEstablishResponse> {
const executor = new AdenaExecutor();
const response = await executor.addEstablish(name);
return response;
},
async DoContract(message: RequestDoContractMessage): Promise<unknown> {
async DoContract(message: TransactionParams): Promise<DoContractResponse> {
const executor = new AdenaExecutor();
const response = await executor.doContract(message);
return response;
},
async GetAccount(): Promise<unknown> {
async GetAccount(): Promise<GetAccountResponse> {
const executor = new AdenaExecutor();
const response = await executor.getAccount();
return response;
},
async Sign(message: RequestDoContractMessage): Promise<unknown> {
async Sign(message: TransactionParams): Promise<WalletResponse<unknown>> {
const executor = new AdenaExecutor();
const response = await executor.signAmino(message);
return response;
},
async SignTx(message: RequestDoContractMessage): Promise<unknown> {
async SignTx(message: TransactionParams): Promise<SignTxResponse> {
const executor = new AdenaExecutor();
const response = await executor.signTx(message);
return response;
},
async AddNetwork(chain: RequestAddedNetworkMessage): Promise<unknown> {
async AddNetwork(chain: AddNetworkParams): Promise<AddNetworkResponse> {
const executor = new AdenaExecutor();
const response = await executor.addNetwork(chain);
return response;
},
async SwitchNetwork(chainId: string): Promise<unknown> {
async SwitchNetwork(chainId: string): Promise<SwitchNetworkResponse> {
const executor = new AdenaExecutor();
const response = await executor.switchNetwork(chainId);
return response;
Expand Down
119 changes: 69 additions & 50 deletions packages/adena-extension/src/inject/executor/executor.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@
import { InjectionMessage, InjectionMessageInstance, MessageKeyType } from '../message';
import {
WalletResponse,
WalletResponseExecuteType,
WalletResponseFailureType,
WalletResponseStatus,
WalletResponseType,
} from '@adena-wallet/sdk';
import { v4 as uuidv4 } from 'uuid';

import {
validateDoContractRequest,
validateTransactionMessageOfAddPkg,
validateTransactionMessageOfBankSend,
validateTransactionMessageOfRun,
validateTransactionMessageOfVmCall,
} from '@common/validation/validation-message';
import {
AddEstablishResponse,
AddNetworkParams,
AddNetworkResponse,
DoContractResponse,
GetAccountResponse,
SignTxResponse,
SwitchNetworkResponse,
TransactionParams,
} from '@inject/types';
import { InjectionMessage, InjectionMessageInstance } from '../message';

type Params = { [key in string]: any };

export interface RequestAddedNetworkMessage {
chainId: string;
chainName: string;
rpcUrl: string;
}

export interface RequestDoContractMessage {
messages: Array<{
type: string;
value: { [key in string]: any };
}>;
gasFee: number;
gasWanted: number;
memo?: string;
}

export class AdenaExecutor {
private eventKey;

private isListen;

private eventMessage: InjectionMessage | undefined;

private resolver: ((message: unknown) => void) | undefined;
private resolver: ((message: WalletResponse<unknown>) => void) | undefined;

private messages: {
[key in string]: { request: InjectionMessage; response: InjectionMessage | undefined };
Expand All @@ -56,90 +58,104 @@ export class AdenaExecutor {
return AdenaExecutor.instance;
};

public addEstablish = (name?: string): Promise<unknown> => {
const eventMessage = AdenaExecutor.createEventMessage('ADD_ESTABLISH', {
public addEstablish = (name?: string): Promise<AddEstablishResponse> => {
const eventMessage = AdenaExecutor.createEventMessage(WalletResponseExecuteType.ADD_ESTABLISH, {
name: name ?? 'Unknown',
});
return this.sendEventMessage(eventMessage);
return this.sendEventMessage<boolean>(eventMessage);
};

public doContract = (params: RequestDoContractMessage): Promise<unknown> => {
public doContract = (params: TransactionParams): Promise<DoContractResponse> => {
const result = this.validateContractMessage(params);
if (result) {
return this.sendEventMessage(result);
}
const eventMessage = AdenaExecutor.createEventMessage('DO_CONTRACT', params);
const eventMessage = AdenaExecutor.createEventMessage(
WalletResponseExecuteType.DO_CONTRACT,
params,
);
return this.sendEventMessage(eventMessage);
};

public getAccount = (): Promise<unknown> => {
const eventMessage = AdenaExecutor.createEventMessage('GET_ACCOUNT');
public getAccount = (): Promise<GetAccountResponse> => {
const eventMessage = AdenaExecutor.createEventMessage(WalletResponseExecuteType.GET_ACCOUNT);
return this.sendEventMessage(eventMessage);
};

public signAmino = (params: RequestDoContractMessage): Promise<unknown> => {
public signAmino = (params: TransactionParams): Promise<WalletResponse<unknown>> => {
const result = this.validateContractMessage(params);
if (result) {
return this.sendEventMessage(result);
}
const eventMessage = AdenaExecutor.createEventMessage('SIGN_AMINO', params);
const eventMessage = AdenaExecutor.createEventMessage(
WalletResponseExecuteType.SIGN_AMINO,
params,
);
return this.sendEventMessage(eventMessage);
};

public signTx = (params: RequestDoContractMessage): Promise<unknown> => {
public signTx = (params: TransactionParams): Promise<SignTxResponse> => {
const result = this.validateContractMessage(params);
if (result) {
return this.sendEventMessage(result);
}
const eventMessage = AdenaExecutor.createEventMessage('SIGN_TX', params);
const eventMessage = AdenaExecutor.createEventMessage(
WalletResponseExecuteType.SIGN_TX,
params,
);
return this.sendEventMessage(eventMessage);
};

public addNetwork = (chain: RequestAddedNetworkMessage): Promise<unknown> => {
const eventMessage = AdenaExecutor.createEventMessage('ADD_NETWORK', { ...chain });
public addNetwork = (chain: AddNetworkParams): Promise<AddNetworkResponse> => {
const eventMessage = AdenaExecutor.createEventMessage(WalletResponseExecuteType.ADD_NETWORK, {
...chain,
});
return this.sendEventMessage(eventMessage);
};

public switchNetwork = (chainId: string): Promise<unknown> => {
const eventMessage = AdenaExecutor.createEventMessage('SWITCH_NETWORK', { chainId });
public switchNetwork = (chainId: string): Promise<SwitchNetworkResponse> => {
const eventMessage = AdenaExecutor.createEventMessage(
WalletResponseExecuteType.SWITCH_NETWORK,
{ chainId },
);
return this.sendEventMessage(eventMessage);
};

private validateContractMessage = (
params: RequestDoContractMessage,
): InjectionMessage | undefined => {
private validateContractMessage = (params: TransactionParams): InjectionMessage | undefined => {
if (!validateDoContractRequest(params)) {
return InjectionMessageInstance.failure('INVALID_FORMAT');
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
}
for (const message of params.messages) {
switch (message.type) {
case '/bank.MsgSend':
if (!validateTransactionMessageOfBankSend(message)) {
return InjectionMessageInstance.failure('INVALID_FORMAT');
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
}
break;
case '/vm.m_call':
if (!validateTransactionMessageOfVmCall(message)) {
return InjectionMessageInstance.failure('INVALID_FORMAT');
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
}
break;
case '/vm.m_addpkg':
if (!validateTransactionMessageOfAddPkg(message)) {
return InjectionMessageInstance.failure('INVALID_FORMAT');
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
}
break;
case '/vm.m_run':
if (!validateTransactionMessageOfRun(message)) {
return InjectionMessageInstance.failure('INVALID_FORMAT');
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
}
break;
default:
return InjectionMessageInstance.failure('UNSUPPORTED_TYPE');
return InjectionMessageInstance.failure(WalletResponseFailureType.UNSUPPORTED_TYPE);
}
}
};

private sendEventMessage = (eventMessage: InjectionMessage): Promise<unknown> => {
private sendEventMessage = <T = unknown>(
eventMessage: InjectionMessage,
): Promise<WalletResponse<T>> => {
this.listen();
this.eventMessage = {
...eventMessage,
Expand All @@ -153,8 +169,8 @@ export class AdenaExecutor {
response: undefined,
};

return new Promise((resolver) => {
this.resolver = resolver;
return new Promise<WalletResponse<T>>((resolver) => {
this.resolver = resolver as (message: WalletResponse<unknown>) => void;
}).finally(() => this.unlisten());
};

Expand All @@ -171,11 +187,14 @@ export class AdenaExecutor {
window.removeEventListener('message', this.messageHandler, true);
};

private static createEventMessage = (type: MessageKeyType, params?: Params): InjectionMessage => {
private static createEventMessage = (
type: WalletResponseType,
params?: Params,
): InjectionMessage => {
return InjectionMessageInstance.request(type, params);
};

private messageHandler = (event: MessageEvent<InjectionMessage | any>): void => {
private messageHandler = (event: MessageEvent<InjectionMessage>): void => {
const eventData = event.data;
if (eventData.status) {
const { key, status, data, code, message, type } = eventData;
Expand All @@ -187,7 +206,7 @@ export class AdenaExecutor {
this.unlisten();
this.resolver &&
this.resolver({
status,
status: status as WalletResponseStatus,
data,
code,
message,
Expand All @@ -198,8 +217,8 @@ export class AdenaExecutor {
this.unlisten();
this.resolver &&
this.resolver({
status,
data: Object.keys(data).length > 0 ? data : null,
status: status as WalletResponseStatus,
data: Object.keys(data || {}).length > 0 ? data : null,
code,
message,
type,
Expand Down
13 changes: 10 additions & 3 deletions packages/adena-extension/src/inject/message/message-handler.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { WalletResponseFailureType } from '@adena-wallet/sdk';
import { HandlerMethod } from '.';
import { InjectionMessage, InjectionMessageInstance } from './message';
import { existsPopups, removePopups } from './methods';
Expand Down Expand Up @@ -47,7 +48,9 @@ export class MessageHandler {
existsWallet = false;
}
if (!existsWallet) {
sendResponse(InjectionMessageInstance.failure('NO_ACCOUNT', {}, message.key));
sendResponse(
InjectionMessageInstance.failure(WalletResponseFailureType.NO_ACCOUNT, {}, message.key),
);
return;
}
const isPopup = await existsPopups();
Expand All @@ -72,7 +75,7 @@ export class MessageHandler {
.catch(() => {
sendResponse(
InjectionMessageInstance.failure(
'UNRESOLVED_TRANSACTION_EXISTS',
WalletResponseFailureType.UNRESOLVED_TRANSACTION_EXISTS,
message,
message.key,
),
Expand All @@ -98,7 +101,11 @@ export class MessageHandler {
})
.catch(() => {
sendResponse(
InjectionMessageInstance.failure('UNEXPECTED_ERROR', message, message.key),
InjectionMessageInstance.failure(
WalletResponseFailureType.UNEXPECTED_ERROR,
message,
message.key,
),
);
});
break;
Expand Down
Loading

0 comments on commit cb15871

Please sign in to comment.