Skip to content

Commit

Permalink
feat: passing the custom outputs to signAndExecuteTransaction
Browse files Browse the repository at this point in the history
  • Loading branch information
bruceeewong committed Jun 17, 2024
1 parent 24d020a commit 4d2c989
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 32 deletions.
36 changes: 18 additions & 18 deletions packages/kit/src/components/WalletProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@ import {
WalletEvent,
WalletEventListeners,
} from "@suiet/wallet-sdk";
import { SuiReportTransactionEffectsMethod } from "@mysten/wallet-standard/dist/esm";
import {
ExecuteTransactionOptions,
ExecuteTransactionResult,
} from "../types/params";
import { SuiClient } from "@mysten/sui/client";
import { toB64 } from "@mysten/sui/utils";
import { SuiClientContext } from "../contexts/SuiClientContext";
import { SuiSignAndExecuteTransactionOutput } from "@mysten/wallet-standard";

export type WalletProviderProps = Extendable & {
defaultWallets?: IDefaultWallet[];
Expand Down Expand Up @@ -279,10 +279,10 @@ export const WalletProvider = (props: WalletProviderProps) => {
);

const signAndExecuteTransaction = useCallback(
async (
async <Output extends SuiSignAndExecuteTransactionOutput>(
input: Omit<SuiSignAndExecuteTransactionInput, "account" | "chain">,
options?: ExecuteTransactionOptions
) => {
): Promise<Output> => {
const [_wallet, account] = safelyGetWalletAndAccount();

const executeTransaction = async (
Expand All @@ -291,32 +291,31 @@ export const WalletProvider = (props: WalletProviderProps) => {
if (typeof options?.execute === "function") {
return await options.execute(signedTransaction);
}
const { digest, rawEffects } = await suiClient.executeTransactionBlock({
// by default, we only return the digest and rawEffects
return await suiClient.executeTransactionBlock({
transactionBlock: signedTransaction.bytes,
signature: signedTransaction.signature,
options: {
showRawEffects: true,
},
});
return {
digest,
rawEffects,
};
};

const signedTransaction = await _wallet.signTransaction({
transaction: input.transaction,
account,
chain: chain.id as IdentifierString,
});
const execResult = await executeTransaction(signedTransaction);
const { digest, effects, ...res } = await executeTransaction(
signedTransaction
);

let effects: string;
let effectsB64: string;

if ("effects" in execResult && execResult.effects?.bcs) {
effects = execResult.effects.bcs;
} else if ("rawEffects" in execResult) {
effects = toB64(new Uint8Array(execResult.rawEffects!));
if (effects && "bcs" in (effects as any)) {
effectsB64 = (effects as any)?.bcs;
} else if (res && (("rawEffects" in res) as any)) {
effectsB64 = toB64(new Uint8Array((res as any).rawEffects));
} else {
throw new Error(
"effects or rawEffects not found in the execution result"
Expand All @@ -325,7 +324,7 @@ export const WalletProvider = (props: WalletProviderProps) => {

try {
await _wallet.reportTransactionEffects({
effects,
effects: effectsB64,
account,
chain: chain.id as IdentifierString,
});
Expand All @@ -336,9 +335,10 @@ export const WalletProvider = (props: WalletProviderProps) => {
return {
bytes: signedTransaction.bytes,
signature: signedTransaction.signature,
digest: execResult.digest,
effects,
};
digest: digest,
effects: effectsB64,
...res,
} as Output;
},
[safelyGetWalletAndAccount, chain, suiClient]
);
Expand Down
9 changes: 6 additions & 3 deletions packages/kit/src/hooks/useWallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ import {
WalletAccount,
SignedTransaction,
} from "@mysten/wallet-standard";
import { ExecuteTransactionOptions } from "../types/params";
import {
ExecuteTransactionOptions,
ExecuteTransactionResult,
} from "../types/params";

export interface WalletContextState {
configuredWallets: IWallet[];
Expand All @@ -43,10 +46,10 @@ export interface WalletContextState {
disconnect: () => Promise<void>;
getAccounts: () => readonly WalletAccount[];

signAndExecuteTransaction(
signAndExecuteTransaction<Output extends SuiSignAndExecuteTransactionOutput>(
input: Omit<SuiSignAndExecuteTransactionInput, "account" | "chain">,
options?: ExecuteTransactionOptions
): Promise<SuiSignAndExecuteTransactionOutput>;
): Promise<Output>;

signTransaction(
input: Omit<SuiSignTransactionInput, "account" | "chain">
Expand Down
26 changes: 15 additions & 11 deletions packages/kit/src/types/params.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import { SignedTransaction } from "@mysten/wallet-standard";
import { SuiTransactionBlockResponse } from "@mysten/sui/client";
import {
SignedTransaction,
SuiSignAndExecuteTransactionOutput,
} from "@mysten/wallet-standard";

export type RpcClientExecuteTransactionResult = SuiTransactionBlockResponse;
export type GraphQLClientExecuteTransactionResult = {
digest: string;
effects?: {
bcs?: string;
};
};

export type ExecuteTransactionResult =
| {
digest: string;
rawEffects?: number[];
}
| {
digest: string;
effects?: {
bcs?: string;
};
};
| RpcClientExecuteTransactionResult
| GraphQLClientExecuteTransactionResult;

export type ExecuteTransactionOptions = {
execute?: (
Expand Down

0 comments on commit 4d2c989

Please sign in to comment.