@fogo/sessions-sdk 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/connection.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import { TollboothIdl } from "@fogo/sessions-idls";
2
2
  import { fromLegacyKeypair, fromLegacyPublicKey, fromLegacyTransactionInstruction, fromVersionedTransaction, } from "@solana/compat";
3
3
  import { addSignersToTransactionMessage, appendTransactionMessageInstructions, compressTransactionMessageUsingAddressLookupTables, createSignerFromKeyPair, createSolanaRpc, createTransactionMessage, getAddressFromPublicKey, getBase64EncodedWireTransaction, partiallySignTransaction, partiallySignTransactionMessageWithSigners, pipe, setTransactionMessageFeePayer, setTransactionMessageLifetimeUsingBlockhash, } from "@solana/kit";
4
- import { Keypair, PublicKey, TransactionInstruction, VersionedTransaction, Connection as Web3Connection, } from "@solana/web3.js";
4
+ import { Keypair, PublicKey, VersionedTransaction, Connection as Web3Connection, } from "@solana/web3.js";
5
5
  import BN from "bn.js";
6
6
  import { z } from "zod";
7
7
  import { createPaymasterFeeInstruction } from "./instructions.js";
8
- import { USDC_MINT } from "./mints.js";
9
8
  import { Network } from "./network.js";
10
9
  import { getPaymasterFee, PaymasterResponseError } from "./paymaster.js";
11
10
  const DEFAULT_RPC = {
@@ -22,14 +21,14 @@ export var TransactionResultType;
22
21
  TransactionResultType[TransactionResultType["Failed"] = 1] = "Failed";
23
22
  })(TransactionResultType || (TransactionResultType = {}));
24
23
  const TransactionResult = {
25
- Success: (signature) => ({
26
- type: TransactionResultType.Success,
27
- signature,
28
- }),
29
24
  Failed: (signature, error) => ({
25
+ error,
26
+ signature,
30
27
  type: TransactionResultType.Failed,
28
+ }),
29
+ Success: (signature) => ({
31
30
  signature,
32
- error,
31
+ type: TransactionResultType.Success,
33
32
  }),
34
33
  };
35
34
  export const createSessionConnection = (options) => {
@@ -39,12 +38,12 @@ export const createSessionConnection = (options) => {
39
38
  const addressLookupTableCache = new Map();
40
39
  const sponsorCache = new Map();
41
40
  return {
42
- rpc,
43
41
  connection,
44
- network: options.network,
45
42
  getSolanaConnection: createSolanaConnectionGetter(options.network),
46
- sendToPaymaster: async (domain, sessionKey, instructions, walletPublicKey, extraConfig) => sendToPaymaster({ ...options, rpc, connection, addressLookupTableCache, sponsorCache }, domain, sessionKey, instructions, walletPublicKey, extraConfig),
47
43
  getSponsor: (domain) => getSponsor(options, sponsorCache, domain),
44
+ network: options.network,
45
+ rpc,
46
+ sendToPaymaster: async (domain, sessionKey, instructions, walletPublicKey, extraConfig) => sendToPaymaster({ ...options, addressLookupTableCache, connection, rpc, sponsorCache }, domain, sessionKey, instructions, walletPublicKey, extraConfig),
48
47
  };
49
48
  };
50
49
  const createSolanaConnectionGetter = (network) => {
@@ -81,13 +80,13 @@ const sendToPaymaster = async (connection, domain, sessionKey, instructions, wal
81
80
  url.searchParams.set("variation", extraConfig.variation);
82
81
  }
83
82
  const response = await fetch(url, {
84
- method: "POST",
85
- headers: {
86
- "Content-Type": "application/json",
87
- },
88
83
  body: JSON.stringify({
89
84
  transaction: getBase64EncodedWireTransaction(transaction),
90
85
  }),
86
+ headers: {
87
+ "Content-Type": "application/json",
88
+ },
89
+ method: "POST",
91
90
  });
92
91
  if (response.status === 200) {
93
92
  return sponsorAndSendResponseSchema.parse(await response.json());
@@ -101,7 +100,9 @@ const sendToPaymaster = async (connection, domain, sessionKey, instructions, wal
101
100
  }
102
101
  };
103
102
  const buildTransaction = async (connection, domain, sessionKey, signerKeys, instructions, walletPublicKey, extraConfig) => {
104
- const feeMint = new PublicKey(USDC_MINT[connection.network]); // TODO: make this configurable
103
+ const feeMint = extraConfig?.feeMint === undefined
104
+ ? undefined
105
+ : new PublicKey(extraConfig.feeMint);
105
106
  const [{ value: latestBlockhash }, sponsor, addressLookupTable, signers, feeAmount, sessionKeyAddress,] = await Promise.all([
106
107
  connection.rpc.getLatestBlockhash().send(),
107
108
  connection.sponsor === undefined
@@ -111,7 +112,7 @@ const buildTransaction = async (connection, domain, sessionKey, signerKeys, inst
111
112
  ? Promise.resolve(undefined)
112
113
  : getAddressLookupTable(connection.connection, connection.addressLookupTableCache, extraConfig.addressLookupTable),
113
114
  Promise.all(signerKeys.map((signer) => createSignerFromKeyPair(signer))),
114
- extraConfig?.variation === undefined
115
+ extraConfig?.variation === undefined || feeMint === undefined
115
116
  ? Promise.resolve(new BN(0))
116
117
  : getPaymasterFee(connection.paymaster ?? DEFAULT_PAYMASTER[connection.network], domain, extraConfig.variation, feeMint),
117
118
  sessionKey === undefined
@@ -119,13 +120,13 @@ const buildTransaction = async (connection, domain, sessionKey, signerKeys, inst
119
120
  : getAddressFromPublicKey(sessionKey.publicKey),
120
121
  ]);
121
122
  const tollboothInstruction = await buildTollboothInstructionIfNeeded({
122
- sessionKeyAddress,
123
- walletPublicKey,
124
123
  domain,
125
- feeMint,
126
124
  feeAmount,
125
+ feeMint,
126
+ sessionKeyAddress,
127
+ walletPublicKey,
127
128
  });
128
- return partiallySignTransactionMessageWithSigners(pipe(createTransactionMessage({ version: 0 }), (tx) => setTransactionMessageFeePayer(fromLegacyPublicKey(sponsor), tx), (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), (tx) => appendTransactionMessageInstructions(instructions.map((instruction) => instruction instanceof TransactionInstruction
129
+ return partiallySignTransactionMessageWithSigners(pipe(createTransactionMessage({ version: 0 }), (tx) => setTransactionMessageFeePayer(fromLegacyPublicKey(sponsor), tx), (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), (tx) => appendTransactionMessageInstructions(instructions.map((instruction) => "programId" in instruction
129
130
  ? fromLegacyTransactionInstruction(instruction)
130
131
  : instruction), tx), (tx) => tollboothInstruction === undefined ||
131
132
  tx.instructions.some((instruction) => instruction.programAddress == TollboothIdl.address)
@@ -137,13 +138,15 @@ const buildTransaction = async (connection, domain, sessionKey, signerKeys, inst
137
138
  }), (tx) => addSignersToTransactionMessage(signers, tx)));
138
139
  };
139
140
  const buildTollboothInstructionIfNeeded = ({ sessionKeyAddress, walletPublicKey, domain, feeMint, feeAmount, }) => {
140
- if (feeAmount.gt(new BN(0)) && sessionKeyAddress !== undefined) {
141
+ if (feeAmount.gt(new BN(0)) &&
142
+ sessionKeyAddress !== undefined &&
143
+ feeMint !== undefined) {
141
144
  return createPaymasterFeeInstruction({
142
- sessionKey: new PublicKey(sessionKeyAddress),
143
- walletPublicKey,
144
145
  domain,
145
- feeMint,
146
146
  feeAmount,
147
+ feeMint,
148
+ sessionKey: new PublicKey(sessionKeyAddress),
149
+ walletPublicKey,
147
150
  }).then(fromLegacyTransactionInstruction);
148
151
  }
149
152
  else {
@@ -172,15 +175,15 @@ const getSignerKeys = async (sessionKey, extraSigners) => {
172
175
  const sponsorAndSendResponseSchema = z
173
176
  .discriminatedUnion("type", [
174
177
  z.object({
175
- type: z.literal("success"),
176
178
  signature: z.string(),
179
+ type: z.literal("success"),
177
180
  }),
178
181
  z.object({
179
- type: z.literal("failed"),
180
- signature: z.string(),
181
182
  error: z.object({
182
183
  InstructionError: z.tuple([z.number(), z.unknown()]),
183
184
  }),
185
+ signature: z.string(),
186
+ type: z.literal("failed"),
184
187
  }),
185
188
  ])
186
189
  .transform((data) => {
package/esm/context.d.ts CHANGED
@@ -7,13 +7,13 @@ export declare const createSessionContext: (options: {
7
7
  domain?: string | undefined;
8
8
  }) => Promise<{
9
9
  chainId: string;
10
+ connection: Web3Connection;
10
11
  domain: string;
11
- payer: PublicKey;
12
- internalPayer: PublicKey;
13
12
  getSolanaConnection: () => Promise<Web3Connection>;
14
- connection: Web3Connection;
15
- rpc: import("@solana/kit").Rpc<import("@solana/kit").RequestAirdropApi & import("@solana/kit").GetAccountInfoApi & import("@solana/kit").GetBalanceApi & import("@solana/kit").GetBlockApi & import("@solana/kit").GetBlockCommitmentApi & import("@solana/kit").GetBlockHeightApi & import("@solana/kit").GetBlockProductionApi & import("@solana/kit").GetBlocksApi & import("@solana/kit").GetBlocksWithLimitApi & import("@solana/kit").GetBlockTimeApi & import("@solana/kit").GetClusterNodesApi & import("@solana/kit").GetEpochInfoApi & import("@solana/kit").GetEpochScheduleApi & import("@solana/kit").GetFeeForMessageApi & import("@solana/kit").GetFirstAvailableBlockApi & import("@solana/kit").GetGenesisHashApi & import("@solana/kit").GetHealthApi & import("@solana/kit").GetHighestSnapshotSlotApi & import("@solana/kit").GetIdentityApi & import("@solana/kit").GetInflationGovernorApi & import("@solana/kit").GetInflationRateApi & import("@solana/kit").GetInflationRewardApi & import("@solana/kit").GetLargestAccountsApi & import("@solana/kit").GetLatestBlockhashApi & import("@solana/kit").GetLeaderScheduleApi & import("@solana/kit").GetMaxRetransmitSlotApi & import("@solana/kit").GetMaxShredInsertSlotApi & import("@solana/kit").GetMinimumBalanceForRentExemptionApi & import("@solana/kit").GetMultipleAccountsApi & import("@solana/kit").GetProgramAccountsApi & import("@solana/kit").GetRecentPerformanceSamplesApi & import("@solana/kit").GetRecentPrioritizationFeesApi & import("@solana/kit").GetSignaturesForAddressApi & import("@solana/kit").GetSignatureStatusesApi & import("@solana/kit").GetSlotApi & import("@solana/kit").GetSlotLeaderApi & import("@solana/kit").GetSlotLeadersApi & import("@solana/kit").GetStakeMinimumDelegationApi & import("@solana/kit").GetSupplyApi & import("@solana/kit").GetTokenAccountBalanceApi & import("@solana/kit").GetTokenAccountsByDelegateApi & import("@solana/kit").GetTokenAccountsByOwnerApi & import("@solana/kit").GetTokenLargestAccountsApi & import("@solana/kit").GetTokenSupplyApi & import("@solana/kit").GetTransactionApi & import("@solana/kit").GetTransactionCountApi & import("@solana/kit").GetVersionApi & import("@solana/kit").GetVoteAccountsApi & import("@solana/kit").IsBlockhashValidApi & import("@solana/kit").MinimumLedgerSlotApi & import("@solana/kit").SendTransactionApi & import("@solana/kit").SimulateTransactionApi>;
13
+ internalPayer: PublicKey;
16
14
  network: import("./network.js").Network;
15
+ payer: PublicKey;
16
+ rpc: import("@solana/kit").Rpc<import("@solana/kit").RequestAirdropApi & import("@solana/kit").GetAccountInfoApi & import("@solana/kit").GetBalanceApi & import("@solana/kit").GetBlockApi & import("@solana/kit").GetBlockCommitmentApi & import("@solana/kit").GetBlockHeightApi & import("@solana/kit").GetBlockProductionApi & import("@solana/kit").GetBlocksApi & import("@solana/kit").GetBlocksWithLimitApi & import("@solana/kit").GetBlockTimeApi & import("@solana/kit").GetClusterNodesApi & import("@solana/kit").GetEpochInfoApi & import("@solana/kit").GetEpochScheduleApi & import("@solana/kit").GetFeeForMessageApi & import("@solana/kit").GetFirstAvailableBlockApi & import("@solana/kit").GetGenesisHashApi & import("@solana/kit").GetHealthApi & import("@solana/kit").GetHighestSnapshotSlotApi & import("@solana/kit").GetIdentityApi & import("@solana/kit").GetInflationGovernorApi & import("@solana/kit").GetInflationRateApi & import("@solana/kit").GetInflationRewardApi & import("@solana/kit").GetLargestAccountsApi & import("@solana/kit").GetLatestBlockhashApi & import("@solana/kit").GetLeaderScheduleApi & import("@solana/kit").GetMaxRetransmitSlotApi & import("@solana/kit").GetMaxShredInsertSlotApi & import("@solana/kit").GetMinimumBalanceForRentExemptionApi & import("@solana/kit").GetMultipleAccountsApi & import("@solana/kit").GetProgramAccountsApi & import("@solana/kit").GetRecentPerformanceSamplesApi & import("@solana/kit").GetRecentPrioritizationFeesApi & import("@solana/kit").GetSignaturesForAddressApi & import("@solana/kit").GetSignatureStatusesApi & import("@solana/kit").GetSlotApi & import("@solana/kit").GetSlotLeaderApi & import("@solana/kit").GetSlotLeadersApi & import("@solana/kit").GetStakeMinimumDelegationApi & import("@solana/kit").GetSupplyApi & import("@solana/kit").GetTokenAccountBalanceApi & import("@solana/kit").GetTokenAccountsByDelegateApi & import("@solana/kit").GetTokenAccountsByOwnerApi & import("@solana/kit").GetTokenLargestAccountsApi & import("@solana/kit").GetTokenSupplyApi & import("@solana/kit").GetTransactionApi & import("@solana/kit").GetTransactionCountApi & import("@solana/kit").GetVersionApi & import("@solana/kit").GetVoteAccountsApi & import("@solana/kit").IsBlockhashValidApi & import("@solana/kit").MinimumLedgerSlotApi & import("@solana/kit").SendTransactionApi & import("@solana/kit").SimulateTransactionApi>;
17
17
  sendTransaction: (sessionKey: CryptoKeyPair | undefined, instructions: TransactionOrInstructions, walletPublicKey: PublicKey, sendTxOptions?: SendTransactionOptions) => Promise<import("./connection.js").TransactionResult>;
18
18
  }>;
19
19
  export type SendTransactionOptions = SendTransactionBaseOptions & {
package/esm/context.js CHANGED
@@ -12,13 +12,13 @@ export const createSessionContext = async (options) => {
12
12
  ]);
13
13
  return {
14
14
  chainId: await fetchChainId(options.connection.connection),
15
+ connection: options.connection.connection,
15
16
  domain: getDomain(options.domain),
16
- payer: sponsor,
17
- internalPayer: internalSponsor,
18
17
  getSolanaConnection: options.connection.getSolanaConnection,
19
- connection: options.connection.connection,
20
- rpc: options.connection.rpc,
18
+ internalPayer: internalSponsor,
21
19
  network: options.connection.network,
20
+ payer: sponsor,
21
+ rpc: options.connection.rpc,
22
22
  sendTransaction: (sessionKey, instructions, walletPublicKey, sendTxOptions) => options.connection.sendToPaymaster(sendTxOptions?.paymasterDomain ?? domain, sessionKey, instructions, walletPublicKey, {
23
23
  ...sendTxOptions,
24
24
  addressLookupTable: sendTxOptions?.addressLookupTable ??
package/esm/crypto.js CHANGED
@@ -17,7 +17,7 @@ export const signMessageWithKey = async (publicPrivateKeyPair, message) => {
17
17
  * @returns True if the message and signature are valid, false otherwise
18
18
  */
19
19
  export const verifyMessageWithKey = async (publicKey, message, signature) => {
20
- const isValid = await crypto.subtle.verify({ name: "Ed25519" }, publicKey, bs58.decode(signature), new TextEncoder().encode(message));
20
+ const isValid = await crypto.subtle.verify({ name: "Ed25519" }, publicKey, Buffer.from(bs58.decode(signature)), new TextEncoder().encode(message));
21
21
  return isValid;
22
22
  };
23
23
  /**