Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sdk updates for proposed 1.1 spec #197

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions core/src/encodeURL.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SOLANA_PROTOCOL } from './constants.js';
import type { Amount, Label, Memo, Message, Recipient, References, SPLToken } from './types.js';
import type { Amount, Label, Memo, Message, Recipient, References, SPLToken, Redirect } from './types.js';

/**
* Fields of a Solana Pay transaction request URL.
Expand Down Expand Up @@ -31,18 +31,34 @@ export interface TransferRequestURLFields {
message?: Message;
/** `memo` in the [Solana Pay spec](https://github.com/solana-labs/solana-pay/blob/master/SPEC.md#memo). */
memo?: Memo;
/** `redirect` in the [Solana Pay spec](https://github.com/solana-labs/solana-pay/blob/master/SPEC1.1.md#redirect). */
redirect?: Redirect;
}

/**
* Fields of a Solana Pay message sign request URL.
*/
export interface MessageSignRequestURLFields {
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think this type can be (structurally) the same as TransactionRequestURLFields, right? Label and message can still be used.

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think maybe we should rename the type of request to a Sign Message Request in the spec and here.

Copy link
Collaborator Author

@mcintyre94 mcintyre94 May 5, 2023

Choose a reason for hiding this comment

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

They can still be used, but it seems a bit confusing because wallets would presumably ignore them. Both fields are not inputs in the spec, and are also fields in server responses which I think makes it more confusing. We do already have this problem with transaction requests - I just wasn't sure whether it was a good idea to do the same here, and thought it might be better to move toward removing the fields from transaction request in the SDK instead.

Renaming to Sign Message Request sounds good to me, seems a bit more natural!

/** `link` in the [Solana Pay spec](https://github.com/solana-labs/solana-pay/blob/master/message-signing-spec.md#link). */
link: URL;
}

/**
* Encode a Solana Pay URL.
*
* @param fields Fields to encode in the URL.
*/
export function encodeURL(fields: TransactionRequestURLFields | TransferRequestURLFields): URL {
return 'link' in fields ? encodeTransactionRequestURL(fields) : encodeTransferRequestURL(fields);
export function encodeURL(
fields: TransactionRequestURLFields | TransferRequestURLFields | MessageSignRequestURLFields
): URL {
return 'link' in fields ? encodeTransactionOrMessageSignRequestURL(fields) : encodeTransferRequestURL(fields);
}

function encodeTransactionRequestURL({ link, label, message }: TransactionRequestURLFields): URL {
function encodeTransactionOrMessageSignRequestURL({
link,
label,
message,
}: TransactionRequestURLFields | (MessageSignRequestURLFields & { label: undefined; message: undefined })): URL {
Copy link
Collaborator

Choose a reason for hiding this comment

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

This can also be simplified if we allow those fields.

// Remove trailing slashes
const pathname = link.search
? encodeURIComponent(String(link).replace(/\/\?/, '?'))
Expand All @@ -68,6 +84,7 @@ function encodeTransferRequestURL({
label,
message,
memo,
redirect,
}: TransferRequestURLFields): URL {
const pathname = recipient.toBase58();
const url = new URL(SOLANA_PROTOCOL + pathname);
Expand Down Expand Up @@ -102,5 +119,9 @@ function encodeTransferRequestURL({
url.searchParams.append('memo', memo);
}

if (redirect) {
url.searchParams.append('redirect', redirect.toString());
}

return url;
}
3 changes: 3 additions & 0 deletions core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,8 @@ export type Message = string;
/** `memo` in the [Solana Pay spec](https://github.com/solana-labs/solana-pay/blob/master/SPEC.md#memo). */
export type Memo = string;

/** `redirect` in the [Solana Pay spec](https://github.com/solana-labs/solana-pay/blob/master/SPEC1.1.md#redirect). */
export type Redirect = URL;

/** `link` in the [Solana Pay spec](https://github.com/solana-labs/solana-pay/blob/master/SPEC.md#link). */
export type Link = URL;