import { VelumXClient, buildSponsoredContractCall, RelayerError } from '@velumx/sdk';
import { uintCV, contractPrincipalCV } from '@stacks/transactions';
import { request } from '@stacks/connect';
const velumx = new VelumXClient({ paymasterUrl: '/api/velumx', network: 'testnet' });
// Get public key from connected testnet wallet
const addrResult = await request('stx_getAddresses') as {
addresses: Array<{ address: string; publicKey: string }>;
};
const publicKey = addrResult.addresses[0].publicKey;
// Build a sponsored call against a testnet contract
const unsignedTx = await buildSponsoredContractCall({
contractAddress: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
contractName: 'my-testnet-contract',
functionName: 'my-function',
functionArgs: [uintCV(1_000_000n)],
publicKey,
network: 'testnet',
});
const signResult = await request('stx_signTransaction', {
transaction: unsignedTx instanceof Uint8Array
? Buffer.from(unsignedTx).toString('hex')
: unsignedTx,
broadcast: false,
});
try {
const { txid } = await velumx.sponsor(signResult.transaction);
console.log('Testnet txid:', txid);
// Verify on: https://explorer.hiro.so/txid/<txid>?chain=testnet
} catch (err) {
if (err instanceof RelayerError) {
console.error('Relayer rejected:', err.reason);
} else {
throw err;
}
}