Search
⌃K
Links

Ghost-minting

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="https://dev.voxlink.io/voxlinklib.js" />
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
mint(mainWallet);
// 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();
_tokenIdCounter.increment();
_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());
_tokenIdCounter.increment();
}
}
}