import { buildSponsoredContractCall } from '@velumx/sdk';
import { uintCV, principalCV, contractPrincipalCV } from '@stacks/transactions';
const estimate = await velumx.estimateFee({
feeToken: 'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.aeusdc',
estimatedGas: 150_000,
});
// Guard: relayerAddress is required for USER_PAYS
if (!estimate.relayerAddress) throw new Error('Relayer address missing from fee estimate');
const unsignedTx = await buildSponsoredContractCall({
contractAddress: 'SP...your-paymaster',
contractName: 'my-protocol-paymaster-v1',
functionName: 'my-action',
functionArgs: [
uintCV(1_000_000n), // amount
uintCV(BigInt(estimate.maxFee)), // fee-amount
principalCV(estimate.relayerAddress), // relayer — from estimateFee
contractPrincipalCV('SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR', 'aeusdc'), // fee-token
],
publicKey: userPublicKey,
});
const txForSigning = unsignedTx instanceof Uint8Array
? Buffer.from(unsignedTx).toString('hex')
: unsignedTx;
const signResult = await request('stx_signTransaction', {
transaction: txForSigning,
broadcast: false,
});
const { txid } = await velumx.sponsor(signResult.transaction, {
feeToken: estimate.feeToken,
feeAmount: estimate.maxFee,
});