@solana/kit
Version:
Solana Javascript API
642 lines (631 loc) • 22.9 kB
JavaScript
;
var accounts = require('@solana/accounts');
var addresses = require('@solana/addresses');
var codecs = require('@solana/codecs');
var errors = require('@solana/errors');
var functional = require('@solana/functional');
var instructions = require('@solana/instructions');
var instructionPlans = require('@solana/instruction-plans');
var keys = require('@solana/keys');
var offchainMessages = require('@solana/offchain-messages');
var pluginCore = require('@solana/plugin-core');
var programs = require('@solana/programs');
var rpc = require('@solana/rpc');
var rpcParsedTypes = require('@solana/rpc-parsed-types');
var rpcSubscriptions = require('@solana/rpc-subscriptions');
var rpcTypes = require('@solana/rpc-types');
var signers = require('@solana/signers');
var transactionMessages = require('@solana/transaction-messages');
var transactions = require('@solana/transactions');
var transactionConfirmation = require('@solana/transaction-confirmation');
var rpcSpecTypes = require('@solana/rpc-spec-types');
// src/index.ts
// src/create-async-generator-with-initial-value-and-slot-tracking.ts
async function* createAsyncGeneratorWithInitialValueAndSlotTracking({
abortSignal,
rpcRequest,
rpcValueMapper,
rpcSubscriptionRequest,
rpcSubscriptionValueMapper
}) {
if (abortSignal.aborted) return;
let lastUpdateSlot = -1n;
const queue = [];
let waitingResolve = null;
let waitingReject = null;
let rpcDone = false;
let subscriptionDone = false;
let done = false;
let pendingError;
function markSourcesDone() {
done = true;
if (waitingResolve) {
const resolve = waitingResolve;
waitingResolve = null;
waitingReject = null;
resolve({ done: true, value: void 0 });
}
}
const abortController = new AbortController();
const signal = abortController.signal;
function onAbort() {
done = true;
abortController.abort(abortSignal.reason);
if (waitingResolve) {
const resolve = waitingResolve;
waitingResolve = null;
waitingReject = null;
resolve({ done: true, value: void 0 });
}
}
abortSignal.addEventListener("abort", onAbort);
function enqueue(item) {
if (done || signal.aborted) return;
if (waitingResolve) {
const resolve = waitingResolve;
waitingResolve = null;
waitingReject = null;
resolve({ done: false, value: item });
} else {
queue.push(item);
}
}
function handleError(err) {
if (signal.aborted) return;
done = true;
pendingError = err;
abortController.abort(err);
if (waitingReject) {
const reject = waitingReject;
waitingResolve = null;
waitingReject = null;
reject(err);
}
}
rpcRequest.send({ abortSignal: signal }).then(({ context: { slot }, value }) => {
if (signal.aborted) return;
if (slot < lastUpdateSlot) return;
lastUpdateSlot = slot;
enqueue({ context: { slot }, value: rpcValueMapper(value) });
}).then(() => {
rpcDone = true;
if (subscriptionDone) markSourcesDone();
}).catch(handleError);
rpcSubscriptionRequest.subscribe({ abortSignal: signal }).then(async (notifications) => {
for await (const {
context: { slot },
value
} of notifications) {
if (signal.aborted) return;
if (slot < lastUpdateSlot) continue;
lastUpdateSlot = slot;
enqueue({ context: { slot }, value: rpcSubscriptionValueMapper(value) });
}
subscriptionDone = true;
if (rpcDone) markSourcesDone();
}).catch(handleError);
try {
while (true) {
if (pendingError) throw pendingError;
if (queue.length > 0) {
yield queue.shift();
} else if (done) {
return;
} else {
const result = await new Promise((resolve, reject) => {
waitingResolve = resolve;
waitingReject = reject;
});
if (result.done) return;
yield result.value;
}
}
} finally {
abortSignal.removeEventListener("abort", onAbort);
if (!signal.aborted) {
abortController.abort();
}
}
}
// src/create-reactive-store-with-initial-value-and-slot-tracking.ts
function createReactiveStoreWithInitialValueAndSlotTracking({
abortSignal,
rpcRequest,
rpcValueMapper,
rpcSubscriptionRequest,
rpcSubscriptionValueMapper
}) {
let currentState;
let currentError;
let lastUpdateSlot = -1n;
const subscribers = /* @__PURE__ */ new Set();
const abortController = new AbortController();
abortSignal.addEventListener("abort", () => abortController.abort(abortSignal.reason));
const signal = abortController.signal;
function notifySubscribers() {
subscribers.forEach((cb) => cb());
}
function handleError(err) {
if (signal.aborted) return;
if (currentError !== void 0) return;
currentError = err;
abortController.abort(err);
notifySubscribers();
}
rpcRequest.send({ abortSignal: signal }).then(({ context: { slot }, value }) => {
if (signal.aborted) return;
if (slot < lastUpdateSlot) return;
lastUpdateSlot = slot;
currentState = { context: { slot }, value: rpcValueMapper(value) };
notifySubscribers();
}).catch(handleError);
rpcSubscriptionRequest.subscribe({ abortSignal: signal }).then(async (notifications) => {
for await (const {
context: { slot },
value
} of notifications) {
if (signal.aborted) return;
if (slot < lastUpdateSlot) continue;
lastUpdateSlot = slot;
currentState = {
context: { slot },
value: rpcSubscriptionValueMapper(value)
};
notifySubscribers();
}
}).catch(handleError);
return {
getError() {
return currentError;
},
getState() {
return currentState;
},
subscribe(callback) {
subscribers.add(callback);
return () => {
subscribers.delete(callback);
};
}
};
}
// src/airdrop-internal.ts
async function requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({
abortSignal,
commitment,
confirmSignatureOnlyTransaction,
lamports,
recipientAddress,
rpc
}) {
const airdropTransactionSignature = await rpc.requestAirdrop(recipientAddress, lamports, { commitment }).send({ abortSignal });
await confirmSignatureOnlyTransaction({
abortSignal,
commitment,
signature: airdropTransactionSignature
});
return airdropTransactionSignature;
}
// src/airdrop.ts
function airdropFactory({
rpc,
rpcSubscriptions
}) {
const getRecentSignatureConfirmationPromise = transactionConfirmation.createRecentSignatureConfirmationPromiseFactory({
rpc,
rpcSubscriptions
});
async function confirmSignatureOnlyTransaction(config) {
await transactionConfirmation.waitForRecentTransactionConfirmationUntilTimeout({
...config,
getRecentSignatureConfirmationPromise,
getTimeoutPromise: transactionConfirmation.getTimeoutPromise
});
}
return async function airdrop(config) {
return await requestAndConfirmAirdrop_INTERNAL_ONLY_DO_NOT_EXPORT({
...config,
confirmSignatureOnlyTransaction,
rpc
});
};
}
var PROVISORY_COMPUTE_UNIT_LIMIT = 0;
var MAX_COMPUTE_UNIT_LIMIT = 14e5;
function estimateComputeUnitLimitFactory({
rpc
}) {
return async function estimateComputeUnitLimit(transactionMessage, config) {
const { abortSignal, ...simulateConfig } = config ?? {};
const replaceRecentBlockhash = !transactionMessages.isTransactionMessageWithDurableNonceLifetime(transactionMessage);
const transaction = functional.pipe(
transactionMessage,
(m) => transactionMessages.setTransactionMessageComputeUnitLimit(MAX_COMPUTE_UNIT_LIMIT, m),
transactions.compileTransaction
);
const wireTransactionBytes = transactions.getBase64EncodedWireTransaction(transaction);
try {
const response = await rpc.simulateTransaction(wireTransactionBytes, {
...simulateConfig,
encoding: "base64",
replaceRecentBlockhash,
sigVerify: false
}).send({ abortSignal });
const { err: transactionError, ...simulationResult } = response.value;
if (simulationResult.unitsConsumed == null) {
throw new errors.SolanaError(errors.SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT);
}
if (transactionError) {
throw new errors.SolanaError(errors.SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT, {
...simulationResult,
cause: errors.getSolanaErrorFromTransactionError(transactionError)
});
}
return simulationResult.unitsConsumed > 4294967295n ? 4294967295 : Number(simulationResult.unitsConsumed);
} catch (e) {
if (errors.isSolanaError(e, errors.SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT)) {
throw e;
}
throw new errors.SolanaError(errors.SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT, {
cause: e
});
}
};
}
function estimateAndSetComputeUnitLimitFactory(estimateComputeUnitLimit) {
return async function estimateAndSetComputeUnitLimit(transactionMessage, config) {
const existingLimit = transactionMessages.getTransactionMessageComputeUnitLimit(transactionMessage);
if (existingLimit && existingLimit !== MAX_COMPUTE_UNIT_LIMIT) {
return transactionMessage;
}
const estimatedUnits = await estimateComputeUnitLimit(transactionMessage, config);
return transactionMessages.setTransactionMessageComputeUnitLimit(estimatedUnits, transactionMessage);
};
}
function fillTransactionMessageProvisoryComputeUnitLimit(transactionMessage) {
if (transactionMessages.getTransactionMessageComputeUnitLimit(transactionMessage) !== void 0) {
return transactionMessage;
}
return transactionMessages.setTransactionMessageComputeUnitLimit(PROVISORY_COMPUTE_UNIT_LIMIT, transactionMessage);
}
async function fetchAddressesForLookupTables(lookupTableAddresses, rpc, config) {
if (lookupTableAddresses.length === 0) {
return {};
}
const fetchedLookupTables = await accounts.fetchJsonParsedAccounts(
rpc,
lookupTableAddresses,
config
);
accounts.assertAccountsDecoded(fetchedLookupTables);
accounts.assertAccountsExist(fetchedLookupTables);
return fetchedLookupTables.reduce((acc, lookup) => {
return {
...acc,
[lookup.address]: lookup.data.addresses
};
}, {});
}
// src/decompile-transaction-message-fetching-lookup-tables.ts
async function decompileTransactionMessageFetchingLookupTables(compiledTransactionMessage, rpc, config) {
const lookupTables = "addressTableLookups" in compiledTransactionMessage && compiledTransactionMessage.addressTableLookups !== void 0 && compiledTransactionMessage.addressTableLookups.length > 0 ? compiledTransactionMessage.addressTableLookups : [];
const lookupTableAddresses = lookupTables.map((l) => l.lookupTableAddress);
const { lastValidBlockHeight, ...fetchAccountsConfig } = config ?? {};
const addressesByLookupTableAddress = lookupTableAddresses.length > 0 ? await fetchAddressesForLookupTables(lookupTableAddresses, rpc, fetchAccountsConfig) : {};
return transactionMessages.decompileTransactionMessage(compiledTransactionMessage, {
addressesByLookupTableAddress,
lastValidBlockHeight
});
}
// src/get-minimum-balance-for-rent-exemption.ts
function getMinimumBalanceForRentExemption(space) {
const RENT = {
ACCOUNT_STORAGE_OVERHEAD: 128n,
DEFAULT_EXEMPTION_THRESHOLD: 2n,
DEFAULT_LAMPORTS_PER_BYTE_YEAR: 3480n
};
const requiredLamports = (RENT.ACCOUNT_STORAGE_OVERHEAD + space) * RENT.DEFAULT_LAMPORTS_PER_BYTE_YEAR * RENT.DEFAULT_EXEMPTION_THRESHOLD;
return requiredLamports;
}
function getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, config) {
if (
// The developer has supplied no value for `preflightCommitment`.
!config?.preflightCommitment && // The value of `commitment` is lower than the server default of `preflightCommitment`.
rpcTypes.commitmentComparator(
commitment,
"finalized"
/* default value of `preflightCommitment` */
) < 0
) {
return {
...config,
// In the common case, it is unlikely that you want to simulate a transaction at
// `finalized` commitment when your standard of commitment for confirming the
// transaction is lower. Cap the simulation commitment level to the level of the
// confirmation commitment.
preflightCommitment: commitment
};
}
return config;
}
async function sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({
abortSignal,
commitment,
rpc,
transaction,
...sendTransactionConfig
}) {
const base64EncodedWireTransaction = transactions.getBase64EncodedWireTransaction(transaction);
return await rpc.sendTransaction(base64EncodedWireTransaction, {
...getSendTransactionConfigWithAdjustedPreflightCommitment(commitment, sendTransactionConfig),
encoding: "base64"
}).send({ abortSignal });
}
async function sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({
abortSignal,
commitment,
confirmDurableNonceTransaction,
rpc,
transaction,
...sendTransactionConfig
}) {
const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({
...sendTransactionConfig,
abortSignal,
commitment,
rpc,
transaction
});
await confirmDurableNonceTransaction({
abortSignal,
commitment,
transaction
});
return transactionSignature;
}
async function sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({
abortSignal,
commitment,
confirmRecentTransaction,
rpc,
transaction,
...sendTransactionConfig
}) {
const transactionSignature = await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({
...sendTransactionConfig,
abortSignal,
commitment,
rpc,
transaction
});
await confirmRecentTransaction({
abortSignal,
commitment,
transaction
});
return transactionSignature;
}
// src/send-and-confirm-durable-nonce-transaction.ts
function sendAndConfirmDurableNonceTransactionFactory({
rpc,
rpcSubscriptions
}) {
const getNonceInvalidationPromise = transactionConfirmation.createNonceInvalidationPromiseFactory({ rpc, rpcSubscriptions });
const getRecentSignatureConfirmationPromise = transactionConfirmation.createRecentSignatureConfirmationPromiseFactory({
rpc,
rpcSubscriptions
});
function createNonceInvalidationPromiseHandlingRaceCondition(signature) {
return async function wrappedGetNonceInvalidationPromise(config) {
try {
return await getNonceInvalidationPromise(config);
} catch (e) {
if (errors.isSolanaError(e, errors.SOLANA_ERROR__INVALID_NONCE)) {
let status;
try {
const { value: statuses } = await rpc.getSignatureStatuses([signature]).send({ abortSignal: config.abortSignal });
status = statuses[0];
} catch {
throw e;
}
if (status === null || status === void 0) {
throw e;
}
if (status.confirmationStatus !== null && rpcTypes.commitmentComparator(status.confirmationStatus, config.commitment) >= 0) {
if (status.err !== null) {
throw errors.getSolanaErrorFromTransactionError(status.err);
}
return;
}
return await new Promise(() => {
});
}
throw e;
}
};
}
async function confirmDurableNonceTransaction(config) {
const wrappedGetNonceInvalidationPromise = createNonceInvalidationPromiseHandlingRaceCondition(
transactions.getSignatureFromTransaction(config.transaction)
);
await transactionConfirmation.waitForDurableNonceTransactionConfirmation({
...config,
getNonceInvalidationPromise: wrappedGetNonceInvalidationPromise,
getRecentSignatureConfirmationPromise
});
}
return async function sendAndConfirmDurableNonceTransaction(transaction, config) {
await sendAndConfirmDurableNonceTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({
...config,
confirmDurableNonceTransaction,
rpc,
transaction
});
};
}
function sendAndConfirmTransactionFactory({
rpc,
rpcSubscriptions
}) {
const getBlockHeightExceedencePromise = transactionConfirmation.createBlockHeightExceedencePromiseFactory({
rpc,
rpcSubscriptions
});
const getRecentSignatureConfirmationPromise = transactionConfirmation.createRecentSignatureConfirmationPromiseFactory({
rpc,
rpcSubscriptions
});
async function confirmRecentTransaction(config) {
await transactionConfirmation.waitForRecentTransactionConfirmation({
...config,
getBlockHeightExceedencePromise,
getRecentSignatureConfirmationPromise
});
}
return async function sendAndConfirmTransaction(transaction, config) {
await sendAndConfirmTransactionWithBlockhashLifetime_INTERNAL_ONLY_DO_NOT_EXPORT({
...config,
confirmRecentTransaction,
rpc,
transaction
});
};
}
// src/send-transaction-without-confirming.ts
function sendTransactionWithoutConfirmingFactory({
rpc
}) {
return async function sendTransactionWithoutConfirming(transaction, config) {
await sendTransaction_INTERNAL_ONLY_DO_NOT_EXPORT({
...config,
rpc,
transaction
});
};
}
Object.defineProperty(exports, "createRpcMessage", {
enumerable: true,
get: function () { return rpcSpecTypes.createRpcMessage; }
});
exports.airdropFactory = airdropFactory;
exports.createAsyncGeneratorWithInitialValueAndSlotTracking = createAsyncGeneratorWithInitialValueAndSlotTracking;
exports.createReactiveStoreWithInitialValueAndSlotTracking = createReactiveStoreWithInitialValueAndSlotTracking;
exports.decompileTransactionMessageFetchingLookupTables = decompileTransactionMessageFetchingLookupTables;
exports.estimateAndSetComputeUnitLimitFactory = estimateAndSetComputeUnitLimitFactory;
exports.estimateComputeUnitLimitFactory = estimateComputeUnitLimitFactory;
exports.fetchAddressesForLookupTables = fetchAddressesForLookupTables;
exports.fillTransactionMessageProvisoryComputeUnitLimit = fillTransactionMessageProvisoryComputeUnitLimit;
exports.getMinimumBalanceForRentExemption = getMinimumBalanceForRentExemption;
exports.sendAndConfirmDurableNonceTransactionFactory = sendAndConfirmDurableNonceTransactionFactory;
exports.sendAndConfirmTransactionFactory = sendAndConfirmTransactionFactory;
exports.sendTransactionWithoutConfirmingFactory = sendTransactionWithoutConfirmingFactory;
Object.keys(accounts).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return accounts[k]; }
});
});
Object.keys(addresses).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return addresses[k]; }
});
});
Object.keys(codecs).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return codecs[k]; }
});
});
Object.keys(errors).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return errors[k]; }
});
});
Object.keys(functional).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return functional[k]; }
});
});
Object.keys(instructions).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return instructions[k]; }
});
});
Object.keys(instructionPlans).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return instructionPlans[k]; }
});
});
Object.keys(keys).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return keys[k]; }
});
});
Object.keys(offchainMessages).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return offchainMessages[k]; }
});
});
Object.keys(pluginCore).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return pluginCore[k]; }
});
});
Object.keys(programs).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return programs[k]; }
});
});
Object.keys(rpc).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return rpc[k]; }
});
});
Object.keys(rpcParsedTypes).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return rpcParsedTypes[k]; }
});
});
Object.keys(rpcSubscriptions).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return rpcSubscriptions[k]; }
});
});
Object.keys(rpcTypes).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return rpcTypes[k]; }
});
});
Object.keys(signers).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return signers[k]; }
});
});
Object.keys(transactionMessages).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return transactionMessages[k]; }
});
});
Object.keys(transactions).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
enumerable: true,
get: function () { return transactions[k]; }
});
});
//# sourceMappingURL=index.node.cjs.map
//# sourceMappingURL=index.node.cjs.map