PHP WebShell
Текущая директория: /opt/BitGoJS/node_modules/@stacks/transactions/dist
Просмотр файла: builders.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sponsorTransaction = exports.callReadOnlyFunction = exports.makeContractNonFungiblePostCondition = exports.makeStandardNonFungiblePostCondition = exports.makeContractFungiblePostCondition = exports.makeStandardFungiblePostCondition = exports.makeContractSTXPostCondition = exports.makeStandardSTXPostCondition = exports.makeContractCall = exports.makeUnsignedContractCall = exports.estimateContractFunctionCall = exports.makeContractDeploy = exports.estimateContractDeploy = exports.makeSTXTokenTransfer = exports.makeUnsignedSTXTokenTransfer = exports.getAbi = exports.broadcastRawTransaction = exports.broadcastTransaction = exports.estimateTransfer = exports.getNonce = void 0;
const common_1 = require("@stacks/common");
const transaction_1 = require("./transaction");
const network_1 = require("@stacks/network");
const payload_1 = require("./payload");
const authorization_1 = require("./authorization");
const keys_1 = require("./keys");
const signer_1 = require("./signer");
const postcondition_1 = require("./postcondition");
const constants_1 = require("./constants");
const types_1 = require("./types");
const utils_1 = require("./utils");
const common_2 = require("@stacks/common");
const contract_abi_1 = require("./contract-abi");
const c32check_1 = require("c32check");
async function getNonce(address, network) {
const defaultNetwork = new network_1.StacksMainnet();
const url = network
? network.getAccountApiUrl(address)
: defaultNetwork.getAccountApiUrl(address);
const response = await common_2.fetchPrivate(url);
if (!response.ok) {
let msg = '';
try {
msg = await response.text();
}
catch (error) { }
throw new Error(`Error fetching nonce. Response ${response.status}: ${response.statusText}. Attempted to fetch ${url} and failed with the message: "${msg}"`);
}
const responseText = await response.text();
const result = JSON.parse(responseText);
return BigInt(result.nonce);
}
exports.getNonce = getNonce;
async function estimateTransfer(transaction, network) {
if (transaction.payload.payloadType !== constants_1.PayloadType.TokenTransfer) {
throw new Error(`Transaction fee estimation only possible with ${constants_1.PayloadType[constants_1.PayloadType.TokenTransfer]} transactions. Invoked with: ${constants_1.PayloadType[transaction.payload.payloadType]}`);
}
const requestHeaders = {
Accept: 'application/text',
};
const fetchOptions = {
method: 'GET',
headers: requestHeaders,
};
const defaultNetwork = new network_1.StacksMainnet();
const url = network
? network.getTransferFeeEstimateApiUrl()
: defaultNetwork.getTransferFeeEstimateApiUrl();
const response = await common_2.fetchPrivate(url, fetchOptions);
if (!response.ok) {
let msg = '';
try {
msg = await response.text();
}
catch (error) { }
throw new Error(`Error estimating transaction fee. Response ${response.status}: ${response.statusText}. Attempted to fetch ${url} and failed with the message: "${msg}"`);
}
const feeRateResult = await response.text();
const txBytes = BigInt(transaction.serialize().byteLength);
const feeRate = BigInt(feeRateResult);
return feeRate * txBytes;
}
exports.estimateTransfer = estimateTransfer;
async function broadcastTransaction(transaction, network, attachment) {
const rawTx = transaction.serialize();
const url = network.getBroadcastApiUrl();
return broadcastRawTransaction(rawTx, url, attachment);
}
exports.broadcastTransaction = broadcastTransaction;
async function broadcastRawTransaction(rawTx, url, attachment) {
const options = {
method: 'POST',
headers: { 'Content-Type': attachment ? 'application/json' : 'application/octet-stream' },
body: attachment
? JSON.stringify({
tx: rawTx.toString('hex'),
attachment: attachment.toString('hex'),
})
: rawTx,
};
const response = await common_2.fetchPrivate(url, options);
if (!response.ok) {
try {
return (await response.json());
}
catch (e) {
throw Error(`Failed to broadcast transaction: ${e.message}`);
}
}
const text = await response.text();
const txid = text.replace(/["]+/g, '');
const isValidTxId = utils_1.validateTxId(txid);
if (isValidTxId) {
return {
txid: txid,
};
}
else {
throw new Error(text);
}
}
exports.broadcastRawTransaction = broadcastRawTransaction;
async function getAbi(address, contractName, network) {
const options = {
method: 'GET',
};
const url = network.getAbiApiUrl(address, contractName);
const response = await common_2.fetchPrivate(url, options);
if (!response.ok) {
let msg = '';
try {
msg = await response.text();
}
catch (error) { }
throw new Error(`Error fetching contract ABI for contract "${contractName}" at address ${address}. Response ${response.status}: ${response.statusText}. Attempted to fetch ${url} and failed with the message: "${msg}"`);
}
return JSON.parse(await response.text());
}
exports.getAbi = getAbi;
async function makeUnsignedSTXTokenTransfer(txOptions) {
const defaultOptions = {
fee: BigInt(0),
nonce: BigInt(0),
network: new network_1.StacksMainnet(),
postConditionMode: constants_1.PostConditionMode.Deny,
memo: '',
sponsored: false,
};
const options = Object.assign(defaultOptions, txOptions);
const payload = payload_1.createTokenTransferPayload(options.recipient, options.amount, options.memo);
let authorization = null;
let spendingCondition = null;
if ('publicKey' in options) {
spendingCondition = authorization_1.createSingleSigSpendingCondition(constants_1.AddressHashMode.SerializeP2PKH, options.publicKey, options.nonce, options.fee);
}
else {
spendingCondition = authorization_1.createMultiSigSpendingCondition(constants_1.AddressHashMode.SerializeP2SH, options.numSignatures, options.publicKeys, options.nonce, options.fee);
}
if (options.sponsored) {
authorization = new authorization_1.SponsoredAuthorization(spendingCondition);
}
else {
authorization = new authorization_1.StandardAuthorization(spendingCondition);
}
const postConditions = [];
if (options.postConditions && options.postConditions.length > 0) {
options.postConditions.forEach(postCondition => {
postConditions.push(postCondition);
});
}
const lpPostConditions = types_1.createLPList(postConditions);
const transaction = new transaction_1.StacksTransaction(options.network.version, authorization, payload, lpPostConditions, options.postConditionMode, options.anchorMode, options.network.chainId);
if (txOptions.fee === undefined || txOptions.fee === null) {
const txFee = await estimateTransfer(transaction, options.network);
transaction.setFee(txFee);
}
if (txOptions.nonce === undefined || txOptions.nonce === null) {
const addressVersion = options.network.version === constants_1.TransactionVersion.Mainnet
? constants_1.AddressVersion.MainnetSingleSig
: constants_1.AddressVersion.TestnetSingleSig;
const senderAddress = c32check_1.c32address(addressVersion, transaction.auth.spendingCondition.signer);
const txNonce = await getNonce(senderAddress, options.network);
transaction.setNonce(txNonce);
}
return transaction;
}
exports.makeUnsignedSTXTokenTransfer = makeUnsignedSTXTokenTransfer;
async function makeSTXTokenTransfer(txOptions) {
if ('senderKey' in txOptions) {
const publicKey = keys_1.publicKeyToString(keys_1.getPublicKey(keys_1.createStacksPrivateKey(txOptions.senderKey)));
const options = utils_1.omit(txOptions, 'senderKey');
const transaction = await makeUnsignedSTXTokenTransfer(Object.assign({ publicKey }, options));
const privKey = keys_1.createStacksPrivateKey(txOptions.senderKey);
const signer = new signer_1.TransactionSigner(transaction);
signer.signOrigin(privKey);
return transaction;
}
else {
const options = utils_1.omit(txOptions, 'signerKeys');
const transaction = await makeUnsignedSTXTokenTransfer(options);
const signer = new signer_1.TransactionSigner(transaction);
let pubKeys = txOptions.publicKeys;
for (const key of txOptions.signerKeys) {
const pubKey = keys_1.pubKeyfromPrivKey(key);
pubKeys = pubKeys.filter(pk => pk !== pubKey.data.toString('hex'));
signer.signOrigin(keys_1.createStacksPrivateKey(key));
}
for (const key of pubKeys) {
signer.appendOrigin(keys_1.publicKeyFromBuffer(common_1.Buffer.from(key, 'hex')));
}
return transaction;
}
}
exports.makeSTXTokenTransfer = makeSTXTokenTransfer;
async function estimateContractDeploy(transaction, network) {
if (transaction.payload.payloadType !== constants_1.PayloadType.SmartContract) {
throw new Error(`Contract deploy fee estimation only possible with ${constants_1.PayloadType[constants_1.PayloadType.SmartContract]} transactions. Invoked with: ${constants_1.PayloadType[transaction.payload.payloadType]}`);
}
const requestHeaders = {
Accept: 'application/text',
};
const fetchOptions = {
method: 'GET',
headers: requestHeaders,
};
const defaultNetwork = new network_1.StacksMainnet();
const url = network
? network.getTransferFeeEstimateApiUrl()
: defaultNetwork.getTransferFeeEstimateApiUrl();
const response = await common_2.fetchPrivate(url, fetchOptions);
if (!response.ok) {
let msg = '';
try {
msg = await response.text();
}
catch (error) { }
throw new Error(`Error estimating contract deploy fee. Response ${response.status}: ${response.statusText}. Attempted to fetch ${url} and failed with the message: "${msg}"`);
}
const feeRateResult = await response.text();
const txBytes = common_1.intToBigInt(transaction.serialize().byteLength, false);
const feeRate = common_1.intToBigInt(feeRateResult, false);
return feeRate * txBytes;
}
exports.estimateContractDeploy = estimateContractDeploy;
async function makeContractDeploy(txOptions) {
const defaultOptions = {
fee: BigInt(0),
nonce: BigInt(0),
network: new network_1.StacksMainnet(),
postConditionMode: constants_1.PostConditionMode.Deny,
sponsored: false,
};
const options = Object.assign(defaultOptions, txOptions);
const payload = payload_1.createSmartContractPayload(options.contractName, options.codeBody);
const addressHashMode = constants_1.AddressHashMode.SerializeP2PKH;
const privKey = keys_1.createStacksPrivateKey(options.senderKey);
const pubKey = keys_1.getPublicKey(privKey);
let authorization = null;
const spendingCondition = authorization_1.createSingleSigSpendingCondition(addressHashMode, keys_1.publicKeyToString(pubKey), options.nonce, options.fee);
if (options.sponsored) {
authorization = new authorization_1.SponsoredAuthorization(spendingCondition);
}
else {
authorization = new authorization_1.StandardAuthorization(spendingCondition);
}
const postConditions = [];
if (options.postConditions && options.postConditions.length > 0) {
options.postConditions.forEach(postCondition => {
postConditions.push(postCondition);
});
}
const lpPostConditions = types_1.createLPList(postConditions);
const transaction = new transaction_1.StacksTransaction(options.network.version, authorization, payload, lpPostConditions, options.postConditionMode, options.anchorMode, options.network.chainId);
if (txOptions.fee === undefined || txOptions.fee === null) {
const txFee = await estimateContractDeploy(transaction, options.network);
transaction.setFee(txFee);
}
if (txOptions.nonce === undefined || txOptions.nonce === null) {
const addressVersion = options.network.version === constants_1.TransactionVersion.Mainnet
? constants_1.AddressVersion.MainnetSingleSig
: constants_1.AddressVersion.TestnetSingleSig;
const senderAddress = keys_1.publicKeyToAddress(addressVersion, pubKey);
const txNonce = await getNonce(senderAddress, options.network);
transaction.setNonce(txNonce);
}
if (options.senderKey) {
const signer = new signer_1.TransactionSigner(transaction);
signer.signOrigin(privKey);
}
return transaction;
}
exports.makeContractDeploy = makeContractDeploy;
async function estimateContractFunctionCall(transaction, network) {
if (transaction.payload.payloadType !== constants_1.PayloadType.ContractCall) {
throw new Error(`Contract call fee estimation only possible with ${constants_1.PayloadType[constants_1.PayloadType.ContractCall]} transactions. Invoked with: ${constants_1.PayloadType[transaction.payload.payloadType]}`);
}
const requestHeaders = {
Accept: 'application/text',
};
const fetchOptions = {
method: 'GET',
headers: requestHeaders,
};
const defaultNetwork = new network_1.StacksMainnet();
const url = network
? network.getTransferFeeEstimateApiUrl()
: defaultNetwork.getTransferFeeEstimateApiUrl();
const response = await common_2.fetchPrivate(url, fetchOptions);
if (!response.ok) {
let msg = '';
try {
msg = await response.text();
}
catch (error) { }
throw new Error(`Error estimating contract call fee. Response ${response.status}: ${response.statusText}. Attempted to fetch ${url} and failed with the message: "${msg}"`);
}
const feeRateResult = await response.text();
const txBytes = common_1.intToBigInt(transaction.serialize().byteLength, false);
const feeRate = common_1.intToBigInt(feeRateResult, false);
return feeRate * txBytes;
}
exports.estimateContractFunctionCall = estimateContractFunctionCall;
async function makeUnsignedContractCall(txOptions) {
const defaultOptions = {
fee: BigInt(0),
nonce: BigInt(0),
network: new network_1.StacksMainnet(),
postConditionMode: constants_1.PostConditionMode.Deny,
sponsored: false,
};
const options = Object.assign(defaultOptions, txOptions);
const payload = payload_1.createContractCallPayload(options.contractAddress, options.contractName, options.functionName, options.functionArgs);
if (options === null || options === void 0 ? void 0 : options.validateWithAbi) {
let abi;
if (typeof options.validateWithAbi === 'boolean') {
if (options === null || options === void 0 ? void 0 : options.network) {
abi = await getAbi(options.contractAddress, options.contractName, options.network);
}
else {
throw new Error('Network option must be provided in order to validate with ABI');
}
}
else {
abi = options.validateWithAbi;
}
contract_abi_1.validateContractCall(payload, abi);
}
let spendingCondition = null;
let authorization = null;
if ('publicKey' in options) {
spendingCondition = authorization_1.createSingleSigSpendingCondition(constants_1.AddressHashMode.SerializeP2PKH, options.publicKey, options.nonce, options.fee);
}
else {
spendingCondition = authorization_1.createMultiSigSpendingCondition(constants_1.AddressHashMode.SerializeP2SH, options.numSignatures, options.publicKeys, options.nonce, options.fee);
}
if (options.sponsored) {
authorization = new authorization_1.SponsoredAuthorization(spendingCondition);
}
else {
authorization = new authorization_1.StandardAuthorization(spendingCondition);
}
const postConditions = [];
if (options.postConditions && options.postConditions.length > 0) {
options.postConditions.forEach(postCondition => {
postConditions.push(postCondition);
});
}
const lpPostConditions = types_1.createLPList(postConditions);
const transaction = new transaction_1.StacksTransaction(options.network.version, authorization, payload, lpPostConditions, options.postConditionMode, options.anchorMode, options.network.chainId);
if (txOptions.fee === undefined || txOptions.fee === null) {
const txFee = await estimateContractFunctionCall(transaction, options.network);
transaction.setFee(txFee);
}
if (txOptions.nonce === undefined || txOptions.nonce === null) {
const addressVersion = options.network.version === constants_1.TransactionVersion.Mainnet
? constants_1.AddressVersion.MainnetSingleSig
: constants_1.AddressVersion.TestnetSingleSig;
const senderAddress = c32check_1.c32address(addressVersion, transaction.auth.spendingCondition.signer);
const txNonce = await getNonce(senderAddress, options.network);
transaction.setNonce(txNonce);
}
return transaction;
}
exports.makeUnsignedContractCall = makeUnsignedContractCall;
async function makeContractCall(txOptions) {
if ('senderKey' in txOptions) {
const publicKey = keys_1.publicKeyToString(keys_1.getPublicKey(keys_1.createStacksPrivateKey(txOptions.senderKey)));
const options = utils_1.omit(txOptions, 'senderKey');
const transaction = await makeUnsignedContractCall(Object.assign({ publicKey }, options));
const privKey = keys_1.createStacksPrivateKey(txOptions.senderKey);
const signer = new signer_1.TransactionSigner(transaction);
signer.signOrigin(privKey);
return transaction;
}
else {
const options = utils_1.omit(txOptions, 'signerKeys');
const transaction = await makeUnsignedContractCall(options);
const signer = new signer_1.TransactionSigner(transaction);
let pubKeys = txOptions.publicKeys;
for (const key of txOptions.signerKeys) {
const pubKey = keys_1.pubKeyfromPrivKey(key);
pubKeys = pubKeys.filter(pk => pk !== pubKey.data.toString('hex'));
signer.signOrigin(keys_1.createStacksPrivateKey(key));
}
for (const key of pubKeys) {
signer.appendOrigin(keys_1.publicKeyFromBuffer(common_1.Buffer.from(key, 'hex')));
}
return transaction;
}
}
exports.makeContractCall = makeContractCall;
function makeStandardSTXPostCondition(address, conditionCode, amount) {
return postcondition_1.createSTXPostCondition(types_1.createStandardPrincipal(address), conditionCode, amount);
}
exports.makeStandardSTXPostCondition = makeStandardSTXPostCondition;
function makeContractSTXPostCondition(address, contractName, conditionCode, amount) {
return postcondition_1.createSTXPostCondition(types_1.createContractPrincipal(address, contractName), conditionCode, amount);
}
exports.makeContractSTXPostCondition = makeContractSTXPostCondition;
function makeStandardFungiblePostCondition(address, conditionCode, amount, assetInfo) {
return postcondition_1.createFungiblePostCondition(types_1.createStandardPrincipal(address), conditionCode, amount, assetInfo);
}
exports.makeStandardFungiblePostCondition = makeStandardFungiblePostCondition;
function makeContractFungiblePostCondition(address, contractName, conditionCode, amount, assetInfo) {
return postcondition_1.createFungiblePostCondition(types_1.createContractPrincipal(address, contractName), conditionCode, amount, assetInfo);
}
exports.makeContractFungiblePostCondition = makeContractFungiblePostCondition;
function makeStandardNonFungiblePostCondition(address, conditionCode, assetInfo, assetName) {
return postcondition_1.createNonFungiblePostCondition(types_1.createStandardPrincipal(address), conditionCode, assetInfo, assetName);
}
exports.makeStandardNonFungiblePostCondition = makeStandardNonFungiblePostCondition;
function makeContractNonFungiblePostCondition(address, contractName, conditionCode, assetInfo, assetName) {
return postcondition_1.createNonFungiblePostCondition(types_1.createContractPrincipal(address, contractName), conditionCode, assetInfo, assetName);
}
exports.makeContractNonFungiblePostCondition = makeContractNonFungiblePostCondition;
async function callReadOnlyFunction(readOnlyFunctionOptions) {
const defaultOptions = {
network: new network_1.StacksMainnet(),
};
const options = Object.assign(defaultOptions, readOnlyFunctionOptions);
const { contractName, contractAddress, functionName, functionArgs, network, senderAddress } = options;
const url = network.getReadOnlyFunctionCallApiUrl(contractAddress, contractName, functionName);
const args = functionArgs.map(arg => utils_1.cvToHex(arg));
const body = JSON.stringify({
sender: senderAddress,
arguments: args,
});
const response = await common_2.fetchPrivate(url, {
method: 'POST',
body,
headers: {
'Content-Type': 'application/json',
},
});
if (!response.ok) {
let msg = '';
try {
msg = await response.text();
}
catch (error) { }
throw new Error(`Error calling read-only function. Response ${response.status}: ${response.statusText}. Attempted to fetch ${url} and failed with the message: "${msg}"`);
}
return response.json().then(responseJson => utils_1.parseReadOnlyResponse(responseJson));
}
exports.callReadOnlyFunction = callReadOnlyFunction;
async function sponsorTransaction(sponsorOptions) {
var _a;
const defaultOptions = {
fee: 0,
sponsorNonce: 0,
sponsorAddressHashmode: constants_1.AddressHashMode.SerializeP2PKH,
};
const options = Object.assign(defaultOptions, sponsorOptions);
const network = (_a = sponsorOptions.network) !== null && _a !== void 0 ? _a : (options.transaction.version === constants_1.TransactionVersion.Mainnet
? new network_1.StacksMainnet()
: new network_1.StacksTestnet());
const sponsorPubKey = keys_1.pubKeyfromPrivKey(options.sponsorPrivateKey);
if (sponsorOptions.fee === undefined || sponsorOptions.fee === null) {
let txFee = BigInt(0);
switch (options.transaction.payload.payloadType) {
case constants_1.PayloadType.TokenTransfer:
txFee = await estimateTransfer(options.transaction, network);
break;
case constants_1.PayloadType.SmartContract:
txFee = await estimateContractDeploy(options.transaction, network);
break;
case constants_1.PayloadType.ContractCall:
txFee = await estimateContractFunctionCall(options.transaction, network);
break;
default:
throw new Error(`Sponsored transactions not supported for transaction type ${constants_1.PayloadType[options.transaction.payload.payloadType]}`);
}
options.transaction.setFee(txFee);
options.fee = txFee;
}
if (sponsorOptions.sponsorNonce === undefined || sponsorOptions.sponsorNonce === null) {
const addressVersion = network.version === constants_1.TransactionVersion.Mainnet
? constants_1.AddressVersion.MainnetSingleSig
: constants_1.AddressVersion.TestnetSingleSig;
const senderAddress = keys_1.publicKeyToAddress(addressVersion, sponsorPubKey);
const sponsorNonce = await getNonce(senderAddress, network);
options.sponsorNonce = sponsorNonce;
}
const sponsorSpendingCondition = authorization_1.createSingleSigSpendingCondition(options.sponsorAddressHashmode, keys_1.publicKeyToString(sponsorPubKey), options.sponsorNonce, options.fee);
options.transaction.setSponsor(sponsorSpendingCondition);
const privKey = keys_1.createStacksPrivateKey(options.sponsorPrivateKey);
const signer = signer_1.TransactionSigner.createSponsorSigner(options.transaction, sponsorSpendingCondition);
signer.signSponsor(privKey);
return options.transaction;
}
exports.sponsorTransaction = sponsorTransaction;
//# sourceMappingURL=builders.js.mapВыполнить команду
Для локальной разработки. Не используйте в интернете!