Skip to content

Commit 61caa62

Browse files
committed
feat: [ADN-733] CREATE_MULTISIG_DOCUMENT
1 parent 4eebcf1 commit 61caa62

File tree

6 files changed

+139
-20
lines changed

6 files changed

+139
-20
lines changed

packages/adena-extension/src/inject.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
AddEstablishResponse,
99
AddNetworkParams,
1010
AddNetworkResponse,
11+
CreateMultisigDocumentParams,
1112
DoContractResponse,
1213
GetAccountResponse,
1314
GetNetworkResponse,
@@ -63,6 +64,11 @@ const init = (): void => {
6364
const response = await executor.signDocument(signedDocument);
6465
return response;
6566
},
67+
async CreateMultisigDocument(params: CreateMultisigDocumentParams) {
68+
const executor = new AdenaExecutor();
69+
const response = await executor.createMultisigDocument(params);
70+
return response;
71+
},
6672
async AddNetwork(chain: AddNetworkParams): Promise<AddNetworkResponse> {
6773
const executor = new AdenaExecutor();
6874
const response = await executor.addNetwork(chain);

packages/adena-extension/src/inject/executor/executor.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
AddEstablishResponse,
1919
AddNetworkParams,
2020
AddNetworkResponse,
21+
CreateMultisigDocumentParams,
2122
DoContractResponse,
2223
GetAccountResponse,
2324
GetNetworkResponse,
@@ -28,6 +29,7 @@ import {
2829
} from '@inject/types';
2930
import { InjectionMessage, InjectionMessageInstance } from '../message';
3031
import {
32+
validateInvalidAddress,
3133
validateSignatures,
3234
validateSignedDocumentFee,
3335
validateSignedDocumentFields,
@@ -124,6 +126,22 @@ export class AdenaExecutor {
124126
return this.sendEventMessage(eventMessage);
125127
};
126128

129+
public createMultisigDocument = (params: CreateMultisigDocumentParams) => {
130+
const result = this.validateCreateMultisigDocument(params);
131+
console.log(result, 'resulst');
132+
if (result) {
133+
return this.sendEventMessage(result);
134+
}
135+
136+
const eventMessage = AdenaExecutor.createEventMessage(
137+
'CREATE_MULTISIG_DOCUMENT' as WalletResponseType,
138+
params,
139+
);
140+
console.log(eventMessage, 'eventMessageeventMessage');
141+
142+
return this.sendEventMessage(eventMessage);
143+
};
144+
127145
public signDocument = (signedDocument: SignedDocument) => {
128146
const result = this.validateSignedDocument(signedDocument);
129147
if (result) {
@@ -190,6 +208,64 @@ export class AdenaExecutor {
190208
return undefined;
191209
};
192210

211+
/**
212+
* Validates CreateMultisigDocumentParams.
213+
* Verifies signers array, threshold value, chain_id, fee structure, and msgs array.
214+
*
215+
* @param params - The CreateMultisigDocumentParams object to validate
216+
* @returns InjectionMessage on validation failure, undefined on success
217+
*/
218+
private validateCreateMultisigDocument = (
219+
params: CreateMultisigDocumentParams,
220+
): InjectionMessage | undefined => {
221+
if (!params) {
222+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
223+
}
224+
225+
// Validate multisigConfig existence
226+
if (!params.multisigConfig) {
227+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
228+
}
229+
230+
const { signers, threshold } = params.multisigConfig;
231+
232+
// Validate signers
233+
if (!Array.isArray(signers) || signers.length < 2) {
234+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_MULTISIG_SIGNERS);
235+
}
236+
237+
// Validate each signer address
238+
try {
239+
for (const signer of signers) {
240+
validateInvalidAddress(signer);
241+
}
242+
} catch (error) {
243+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_MULTISIG_ADDRESS);
244+
}
245+
246+
// Validate threshold
247+
if (typeof threshold !== 'number' || threshold < 1 || threshold > signers.length) {
248+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_MULTISIG_THRESHOLD);
249+
}
250+
251+
// Validate chain_id
252+
if (typeof params.chain_id !== 'string' || !params.chain_id) {
253+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
254+
}
255+
256+
// Validate fee
257+
if (!validateSignedDocumentFee(params.fee)) {
258+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
259+
}
260+
261+
// Validate msgs
262+
if (!validateSignedDocumentMessages(params.msgs)) {
263+
return InjectionMessageInstance.failure(WalletResponseFailureType.INVALID_FORMAT);
264+
}
265+
266+
return this.validateMessages(params.msgs);
267+
};
268+
193269
/**
194270
* Validates a signed document (SignedDocument).
195271
* Verifies the existence and format of required fields (chain_id, account_number, sequence, memo),
@@ -246,6 +322,7 @@ export class AdenaExecutor {
246322
hostname: window.location.hostname,
247323
key: this.eventKey,
248324
};
325+
console.log(this.eventMessage, 'this.eventMessageeventMessageeventMessageeventMessage');
249326

250327
try {
251328
window.postMessage(this.eventMessage, window.location.origin);

packages/adena-extension/src/inject/message/message-handler.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export class MessageHandler {
6767
if (isPopup) {
6868
await removePopups();
6969
}
70+
console.log(message, 'message');
7071

7172
switch (message.type) {
7273
case 'DO_CONTRACT':
@@ -157,6 +158,13 @@ export class MessageHandler {
157158
HandlerMethod.signDocument(message, sendResponse);
158159
}
159160
});
161+
case 'CREATE_MULTISIG_DOCUMENT':
162+
console.log('hi');
163+
HandlerMethod.checkEstablished(core, message, sendResponse).then((isEstablished) => {
164+
if (isEstablished) {
165+
HandlerMethod.createMultisigDocument(message, sendResponse);
166+
}
167+
});
160168
default:
161169
break;
162170
}

packages/adena-extension/src/inject/message/message.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { WalletMessageInfo, WalletResponseType } from '@adena-wallet/sdk';
2-
import { TxSignature } from '@gnolang/tm2-js-client';
32

43
export type StatusType = 'request' | 'response' | 'common' | 'success' | 'failure';
54

@@ -15,10 +14,6 @@ export interface InjectionMessage {
1514
data: { [key in string]: any } | undefined;
1615
}
1716

18-
export interface InjectionMessageWithSignature extends InjectionMessage {
19-
signature?: TxSignature[];
20-
}
21-
2217
export class InjectionMessageInstance {
2318
private key: string;
2419

@@ -41,7 +36,9 @@ export class InjectionMessageInstance {
4136
key?: string,
4237
withNotification?: boolean,
4338
) {
39+
console.trace(WalletMessageInfo[messageKey], messageKey, 'WalletMessageInfo[messageKey]');
4440
const { code, message, type } = WalletMessageInfo[messageKey];
41+
console.log(code, message, type, '!!!!!!!!!!!!');
4542
this.key = key ?? '';
4643
this.code = code || 0;
4744
this.type = type;

packages/adena-extension/src/inject/message/methods/transaction.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@ import { WalletResponseRejectType } from '@adena-wallet/sdk';
22
import { validateInjectionData } from '@common/validation/validation-transaction';
33
import { RoutePath } from '@types';
44
import { HandlerMethod } from '..';
5-
import {
6-
InjectionMessage,
7-
InjectionMessageInstance,
8-
InjectionMessageWithSignature,
9-
} from '../message';
5+
import { InjectionMessage, InjectionMessageInstance } from '../message';
106

117
export const signAmino = async (
128
requestData: InjectionMessage,
@@ -45,7 +41,7 @@ export const signTransaction = async (
4541
};
4642

4743
export const signDocument = async (
48-
requestData: InjectionMessageWithSignature,
44+
requestData: InjectionMessage,
4945
sendResponse: (message: any) => void,
5046
): Promise<void> => {
5147
const validationMessage = validateInjectionData(requestData);
@@ -62,6 +58,27 @@ export const signDocument = async (
6258
);
6359
};
6460

61+
export const createMultisigDocument = async (
62+
requestData: InjectionMessage,
63+
sendResponse: (message: any) => void,
64+
) => {
65+
const validationMessage = validateInjectionData(requestData);
66+
if (validationMessage) {
67+
console.log('if validationMessage');
68+
sendResponse(validationMessage);
69+
return;
70+
}
71+
console.log(validationMessage, 'validationMessage');
72+
73+
console.log('팝업생성');
74+
HandlerMethod.createPopup(
75+
RoutePath.ApproveSignDocument,
76+
requestData,
77+
InjectionMessageInstance.failure(WalletResponseRejectType.SIGN_REJECTED, {}, requestData.key),
78+
sendResponse,
79+
);
80+
};
81+
6582
export const doContract = async (
6683
requestData: InjectionMessage,
6784
sendResponse: (message: any) => void,

packages/adena-extension/src/inject/types/transactions.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,32 @@ export type TransactionParams = {
3939
arguments?: GnoArgumentInfo[] | null;
4040
};
4141

42-
export interface SignedDocument {
42+
export interface Fee {
43+
amount: {
44+
amount: string;
45+
denom: string;
46+
}[];
47+
gas: string;
48+
}
49+
50+
export interface BaseDocument {
4351
chain_id: string;
52+
fee: Fee;
53+
msgs: any[];
54+
}
55+
56+
export interface MultisigConfig {
57+
signers: string[];
58+
threshold: number;
59+
}
60+
export interface CreateMultisigDocumentParams extends BaseDocument {
61+
multisigConfig: MultisigConfig;
62+
memo?: string;
63+
}
64+
65+
export interface SignedDocument extends BaseDocument {
4466
account_number: string;
4567
sequence: string;
46-
fee: {
47-
amount: {
48-
amount: string;
49-
denom: string;
50-
}[];
51-
gas: string;
52-
};
53-
msgs: any[];
5468
memo: string;
5569
signatures: Signature[];
5670
}

0 commit comments

Comments
 (0)