Skip to content

Commit

Permalink
Add abitrary transaction application
Browse files Browse the repository at this point in the history
  • Loading branch information
AaricChen committed Feb 29, 2024
1 parent 7e3533d commit ead227a
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 37 deletions.
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
"MSafe Sui"
],
"dependencies": {
"@mysten/sui.js": "^0.50.1",
"axios": "^1.6.7",
"buffer": "^6.0.3",
"luxon": "^3.4.4",
Expand All @@ -52,7 +53,6 @@
},
"devDependencies": {
"@msafe/sui3-utils": "^3.1.47",
"@mysten/sui.js": "^0.50.1",
"@mysten/wallet-standard": "^0.10.1",
"@types/jest": "^29.2.1",
"@types/luxon": "^3.4.2",
Expand All @@ -76,7 +76,6 @@
},
"peerDependencies": {
"@msafe/sui3-utils": "^3.1.47",
"@mysten/sui.js": "^0.50.1",
"@mysten/wallet-standard": "^0.10.1"
}
}
10 changes: 8 additions & 2 deletions src/apps/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@ import { SuiNetworks } from '@/types';

export interface MSafeAppHelper<T> {
application: string;
deserialize(input: SuiSignTransactionBlockInput): {
deserialize(
input: SuiSignTransactionBlockInput & {
network: SuiNetworks;
suiClient: SuiClient;
account: WalletAccount;
},
): Promise<{
txType: TransactionType;
txSubType: string;
intentionData: T;
};
}>;
build(input: {
network: SuiNetworks;
txType: TransactionType;
Expand Down
8 changes: 3 additions & 5 deletions src/apps/mpay/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,9 @@ export type MPayIntentionData = CreateStreamIntentionData;
export class MPayAppHelper implements MSafeAppHelper<MPayIntentionData> {
application = 'mpay';

deserialize(input: SuiSignTransactionBlockInput): {
txType: TransactionType;
txSubType: string;
intentionData: MPayIntentionData;
} {
async deserialize(
input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },
): Promise<{ txType: TransactionType; txSubType: string; intentionData: CreateStreamIntentionData }> {
const { chain, transactionBlock } = input;
const globals = Globals.new(chain === 'sui:mainnet' ? Env.prod : Env.dev);
const decoder = new DecodeHelper(globals, transactionBlock);
Expand Down
6 changes: 1 addition & 5 deletions src/apps/msafe-core/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,7 @@ export class CoreHelper implements MSafeAppHelper<CoreIntentionData> {
this.application = TransactionDefaultApplication;
}

deserialize(): {
txType: TransactionType;
txSubType: string;
intentionData: CoreIntentionData;
} {
deserialize(): Promise<{ txType: TransactionType; txSubType: string; intentionData: CoreIntentionData }> {
throw new Error('MSafe core transaction intention should be build from API');
}

Expand Down
62 changes: 62 additions & 0 deletions src/apps/plain-transaction/helper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { TransactionType } from '@msafe/sui3-utils';
import { SuiClient } from '@mysten/sui.js/client';
import { TransactionBlock } from '@mysten/sui.js/transactions';
import { fromHEX, toHEX } from '@mysten/sui.js/utils';
import { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';
import sortKeys from 'sort-keys-recursive';

import { MSafeAppHelper, TransactionIntention } from '@/apps/interface';
import { SuiNetworks } from '@/types';

export type PlainTransactionData = {
content: string;
};

export const PlainTransactionApplication = 'msafe-plain-tx';
export const PlainTransactionType = 'PlainTransaction';

export class PlainTransactionIntention implements TransactionIntention<PlainTransactionData> {
application = PlainTransactionApplication;

txType = TransactionType.Other;

txSubType = PlainTransactionType;

protected constructor(public readonly data: PlainTransactionData) {}

serialize() {
return JSON.stringify(sortKeys(this.data));
}
}
export class PlainTransactionHelper implements MSafeAppHelper<PlainTransactionData> {
application: string;

constructor() {
this.application = PlainTransactionApplication;
}

async deserialize(
input: SuiSignTransactionBlockInput & { network: SuiNetworks; suiClient: SuiClient; account: WalletAccount },
): Promise<{ txType: TransactionType; txSubType: string; intentionData: PlainTransactionData }> {
const { transactionBlock, suiClient } = input;

const content = await transactionBlock.build({ client: suiClient });

return {
txType: TransactionType.Other,
txSubType: PlainTransactionType,
intentionData: { content: toHEX(content) },
};
}

async build(input: {
network: SuiNetworks;
txType: TransactionType;
txSubType: string;
intentionData: PlainTransactionData;
suiClient: SuiClient;
account: WalletAccount;
}): Promise<TransactionBlock> {
return TransactionBlock.from(fromHEX(input.intentionData.content));
}
}
23 changes: 0 additions & 23 deletions src/apps/registry.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import { TransactionType } from '@msafe/sui3-utils';
import { SuiClient } from '@mysten/sui.js/client';
import { SuiSignTransactionBlockInput, WalletAccount } from '@mysten/wallet-standard';

import { MSafeAppHelper } from '@/apps/interface';
import { SuiNetworks } from '@/types';

export class MSafeApps {
apps: Map<string, MSafeAppHelper<any>>;
Expand All @@ -19,22 +14,4 @@ export class MSafeApps {
}
return app;
}

deserialize(appName: string, input: SuiSignTransactionBlockInput) {
return this.getAppHelper(appName).deserialize(input);
}

build(
appName: string,
input: {
network: SuiNetworks;
intentionData: any;
txType: TransactionType;
txSubType: string;
suiClient: SuiClient;
account: WalletAccount;
},
) {
return this.getAppHelper(appName).build(input);
}
}

0 comments on commit ead227a

Please sign in to comment.