@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/cjs/connection.d.ts +12 -11
- package/cjs/connection.js +29 -26
- package/cjs/context.d.ts +4 -4
- package/cjs/context.js +4 -4
- package/cjs/crypto.js +1 -1
- package/cjs/index.d.ts +218 -2028
- package/cjs/index.js +115 -72
- package/cjs/instructions.js +9 -9
- package/esm/connection.d.ts +12 -11
- package/esm/connection.js +30 -27
- package/esm/context.d.ts +4 -4
- package/esm/context.js +4 -4
- package/esm/crypto.js +1 -1
- package/esm/index.d.ts +218 -2028
- package/esm/index.js +82 -72
- package/esm/instructions.js +9 -9
- package/package.json +41 -40
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,
|
|
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
|
-
|
|
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 =
|
|
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) =>
|
|
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)) &&
|
|
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
|
-
|
|
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
|
-
|
|
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
|
/**
|