import { Command } from 'commander'; import fs from 'fs'; import * as evm from './handlers/evm'; import * as solana from './handlers/solana'; const xmint = new Command(); const config = JSON.parse(fs.readFileSync('./xdapp.config.json').toString()) xmint .name('xMint') .description("Cross chain token minting, transfers, and widrawals.") .version("0.1.0"); xmint .command("deploy") .description("Deploys on chain code.") .argument("", "the network you want to deply") .action(async (src) => { if(!config.networks[src]){ console.error(`ERROR: ${src} not found in xdapp.config.json`); return; } console.log(`Deploying ${src}...`); switch(config.networks[src].type){ case "evm": await evm.deploy(src); break; case "solana": await solana.deploy(src); break; } console.log(`Deploy finished!`); }); xmint .command("register-app") .description("Registers the target app and target token with the source on chain app") .argument("", "the network you want to register the app on") .argument("", "the network you want to register") .action(async (src, target) => { if(!config.networks[src]){ console.error(`ERROR: ${src} not found in xdapp.config.json`); return; } if(!config.networks[target]){ console.error(`ERROR: ${target} not found in xdapp.config.json`); return; } let srcHandler; switch(config.networks[src].type){ case "evm": srcHandler = evm; break; case "solana": srcHandler = solana; break; } console.log(`Registering ${target} app and token onto ${src} network`) await srcHandler.registerApp(src,target) try{ console.log(`Attesting ${src} Wrapped Native to ${target}`); await srcHandler.attest(src, target, config.networks[src].wrappedNativeAddress) } catch (e) { console.log("ERROR: ", e); console.log("Wrapped Native attestion exists already") } console.log(`${target} contract address was registered on ${src} and ${target} token was attested to ${src}`) }); xmint .command("buy-token") .description("buy token using the src network's native currency and bridge it back to src network and hold as bridged funds") .argument("", "the network with the native token you want to spend") .argument("", "the network whose xmint token you want to buy") .argument("", "amount of token to buy. Always 1 Native : 100 TOKEN") .action(async (src, target, amt) => { if(!config.networks[src]){ console.error(`ERROR: ${src} not found in xdapp.config.json`); return; } if(!config.networks[target]){ console.error(`ERROR: ${target} not found in xdapp.config.json`); return; } if(isNaN(parseInt(amt))){ console.error(`Error: Invalid Amount!`) return; } // Buy Token On Source // SubmitForeignPurchase on Target // Claim Tokens on Source let srcHandler; switch(config.networks[src].type){ case "evm": srcHandler = evm; break; case "solana": srcHandler = solana; break; } let targetHandler; switch(config.networks[target].type){ case "evm": targetHandler = evm; break; case "solana": targetHandler = solana; break; } console.log(`Creating Buy VAA on ${src} network...`); const buyVAA = await srcHandler.buyToken(src, target, parseInt(amt)); console.log(`Submitting buy vaa on ${target} network...`); const claimTokensVAA = await targetHandler.submitForeignPurchase(target, src, buyVAA); console.log(`Claiming tokens on ${src} network...`); await srcHandler.claimTokens(src, claimTokensVAA); console.log(`Purchase of ${amt} of ${target} network's tokens complete.`) }); xmint .command("sell-token") .description("sells token from target network back to target network for src network's native token") .argument("", "the network whose native currency you want to receive") .argument("", "the target network whose token you want to sell") .argument("", "amount of token to sell. Always 1 TOKEN : 0.01 NATIVE") .action(async (src, targe, amt) => { // Sell Token on Source // SubmitForeignSale on Target // Claim Native }); xmint .command("balance") .description("gets the balance of the target networks tokens for src network's keys. Pass in src src if you want find native tokens balance on src network") .argument("", "the network whose key you want to lookup the balance for") .argument("", "the network whose tokens you want to look up the balance for. Pass in src network again to get native token balance. ") .action(async (src, target) => { if(!config.networks[src]){ console.error(`ERROR: ${src} not found in xdapp.config.json`); return; } if(!config.networks[target]){ console.error(`ERROR: ${target} not found in xdapp.config.json`); return; } let balance; switch(config.networks[src].type){ case "evm": balance = await evm.balance(src, target); break; case "solana": balance = await solana.balance(src, target); break; } console.log(`Balance of ${src} key for ${target} tokens is ${balance}`); }) xmint .command("debug") .action(async () => { await solana.debug(); }) xmint.parse();