Mint with your burner wallet and have the cryptoasset automagically delivered to your main wallet.
The ghost-minting solution can only be integrated if your minting function accepts a flexible recipient address. If you haven't deployed your smart contract yet, please get in touch with us.

Off-chain ghost-minting

In the Voxlink JavaScript library we offer a fully guided ghost-minting experience.
In order to use the Voxlink JavaScript library, you need to add it to your page:
<script src="" />
In your application you might have a "minting button":
<button onclick="startMinting()">Mint</button>
This is how your JavaScript might look like:
var { success, mainWallet } = await Voxlink.ghostminting.start();
// resultingWallet will contain the connected wallet,
// if the user does not have a Voxlink burner or if they have chosen not to use it
// otherwise it will contain the address of the main wallet
// success will not be true if the user has stopped the process
if (success){
// the following code is just an example
// please use whatever suits you best
// optionally: listen to events to inform the user...
Please note that your minting function will need to expect an address as flexible recipient. See the example that follows.
// exemplary minting function
// please DO NOT copy and paste this function,
// as it misses necessary checks you may want in your collection
function mint(address to) public{
uint256 tokenId = _tokenIdCounter.current();
_safeMint(to, tokenId);
Please note that our library does not make use of a web3 library. If you need to use a web3 provider, you can configure our library to use it. Check out the API documentation for the call.

On-chain ghost-minting

The on-chain ghost-minting resolves the address in the minting function. There might be reasons to choose this way. Let's have a talk before you take this decision, as this approach will need more gas at mint.
We highly recommend to test the integration on Goerli testnet before deploying to production.
Add the interfaces before your contract begins
interface Voxlink {
function getBurnerWalletsFromMainWallet(address mainWallet) external view returns (bool success, address[] memory burnerWallets);
function getMainWalletFromBurnerWallet(address burnerWallet) external view returns (bool success, address mainWallet);
function burnerWalletExists(address _burnerWallet) external view returns (bool);
contract myNFTProject is ERC721{
address constant VoxlinkContractAddress = 0x0000000000000000000000000000000000000000;
This method mints an amount of tokens to a connected burner wallet or to the msg.sender
Do not use this in production: this minting function has no checks for payment or a limit for the amount!
function mint(uint256 amount) public{
// get the burnerwallet, if there is one
(bool success, address mainWallet) = Voxlink(VoxlinkContractAddress).getMainWalletFromBurnerWallet(msg.sender);
address mintingAddress = (success ? mainWallet : msg.sender);
// if successful, the mainWallet will be used for ghostminting
for (uint256 i;i<amount;i++){
_safeMint(mintingAddress, _tokenIdCounter.current());