Skip to content

Commit

Permalink
feat: add option for passing transaction as hex for signing (#338)
Browse files Browse the repository at this point in the history
* feat: all types hex transaction signing for Stacks

* fix: names

* fix: review comments

* fix: review, SignTransactionHex changed to SignTransaction
  • Loading branch information
fess-v authored Sep 14, 2023
1 parent 1891764 commit e494f87
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 2 deletions.
14 changes: 14 additions & 0 deletions packages/connect-react/src/react/hooks/use-connect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
FinishedAuthData,
openContractCall,
openContractDeploy,
openSignTransaction,
openProfileUpdateRequestPopup,
openPsbtRequestPopup,
openSignatureRequestPopup,
Expand All @@ -23,6 +24,7 @@ import {
STXTransferRegularOptions,
STXTransferSponsoredOptions,
StacksProvider,
SignTransactionOptions,
} from '@stacks/connect';
import { StructuredDataSignatureRequestOptions } from '@stacks/connect/src/types/structuredDataSignature';
import { useContext } from 'react';
Expand Down Expand Up @@ -143,6 +145,17 @@ export const useConnect = () => {
);
}

function doSignTransaction(options: SignTransactionOptions, provider?: StacksProvider) {
return openSignTransaction(
{
...options,
authOrigin: authOptions.authOrigin,
appDetails: authOptions.appDetails,
},
provider
);
}

function sign(options: SignatureRequestOptions, provider?: StacksProvider) {
return openSignatureRequestPopup(
{
Expand Down Expand Up @@ -191,6 +204,7 @@ export const useConnect = () => {
doContractCall,
doContractDeploy,
doSTXTransfer,
doSignTransaction,
doProfileUpdate,
sign,
signStructuredData,
Expand Down
32 changes: 32 additions & 0 deletions packages/connect/src/transactions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import {
ContractDeployRegularOptions,
ContractDeploySponsoredOptions,
FinishedTxPayload,
SignTransactionOptions,
SignTransactionPayload,
SponsoredFinishedTxPayload,
STXTransferOptions,
STXTransferPayload,
Expand Down Expand Up @@ -218,6 +220,28 @@ export const makeSTXTransferToken = async (options: STXTransferOptions) => {
return createUnsignedTransactionPayload(payload);
};

export const makeSignTransaction = async (options: SignTransactionOptions) => {
const { txHex, appDetails, userSession, ..._options } = options;

if (hasAppPrivateKey(userSession)) {
const { privateKey, publicKey } = getKeys(userSession);
const payload: SignTransactionPayload = {
..._options,
txHex,
publicKey,
};
if (appDetails) payload.appDetails = appDetails;
return signPayload(payload, privateKey);
}

const payload: Partial<SignTransactionOptions> = {
..._options,
txHex,
};
if (appDetails) payload.appDetails = appDetails;
return createUnsignedTransactionPayload(payload);
};

async function generateTokenAndOpenPopup<T extends TransactionOptions>(
options: T,
makeTokenFn: (options: T) => Promise<string>,
Expand Down Expand Up @@ -253,3 +277,11 @@ export function openSTXTransfer(
if (!provider) throw new Error('[Connect] No installed Stacks wallet found');
return generateTokenAndOpenPopup(options, makeSTXTransferToken, provider);
}

export function openSignTransaction(
options: SignTransactionOptions,
provider: StacksProvider = getStacksProvider()
) {
if (!provider) throw new Error('[Connect] No installed Stacks wallet found');
return generateTokenAndOpenPopup(options, makeSignTransaction, provider);
}
43 changes: 41 additions & 2 deletions packages/connect/src/types/transactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,20 @@ export interface TxBase {
nonce?: number;
}

export interface SignTransactionBase {
appDetails?: AuthOptions['appDetails'];
network?: StacksNetwork;
attachment?: string;
/**
* Provide wallets with a suggested account to sign this transaction with.
* This is set by default if a `userSession` option is provided.
*/
stxAddress?: string;
txHex: string;
/** @deprecated `unused - only included for compatibility with other transaction types` */
postConditions?: (string | PostCondition)[];
}

export interface SponsoredFinishedTxPayload {
txRaw: string;
}
Expand Down Expand Up @@ -153,10 +167,35 @@ export interface STXTransferPayload extends STXTransferBase {
* Transaction Popup
*/

export type TransactionOptions = ContractCallOptions | ContractDeployOptions | STXTransferOptions;
export type TransactionPayload = ContractCallPayload | ContractDeployPayload | STXTransferPayload;
export type TransactionOptions =
| ContractCallOptions
| ContractDeployOptions
| STXTransferOptions
| SignTransactionOptions;
export type TransactionPayload =
| ContractCallPayload
| ContractDeployPayload
| STXTransferPayload
| SignTransactionPayload;

export interface TransactionPopup {
token: string;
options: TransactionOptions;
}

export interface SignTransactionOptionBase extends SignTransactionBase, OptionsBase {
onFinish?: SignTransactionFinished;
onCancel?: Canceled;
}

export interface SignTransactionPayload extends SignTransactionBase {
publicKey: string;
}

export type SignTransactionFinished = (data: SignTransactionFinishedTxData) => void;

export type SignTransactionOptions = SignTransactionOptionBase;

export interface SignTransactionFinishedTxData {
stacksTransaction: StacksTransaction;
}

1 comment on commit e494f87

@vercel
Copy link

@vercel vercel bot commented on e494f87 Sep 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.