diff --git a/src/cmds/registry-cmds/auction-cmds/create.ts b/src/cmds/registry-cmds/auction-cmds/create.ts new file mode 100644 index 0000000..ad2aa2e --- /dev/null +++ b/src/cmds/registry-cmds/auction-cmds/create.ts @@ -0,0 +1,102 @@ +import { Arguments } from 'yargs'; +import assert from 'assert'; +import Long from 'long'; + +import { Account, DENOM, Registry } from '@cerc-io/registry-sdk'; + +import { getConfig, getConnectionInfo, getGasAndFees, getGasPrice, txOutput } from '../../../util'; +import { MsgCreateAuctionResponse } from '@cerc-io/registry-sdk/dist/proto/cerc/auction/v1/tx'; + +export const command = 'create'; + +export const desc = 'Create auction.'; + +export const builder = { + kind: { + type: 'string' + }, + 'commits-duration': { + type: 'number' + }, + 'reveals-duration': { + type: 'number' + }, + 'commit-fee': { + type: 'string' + }, + 'reveal-fee': { + type: 'string' + }, + 'minimum-bid': { + type: 'string' + }, + 'max-price': { + type: 'string' + }, + 'num-providers': { + type: 'string' + } +}; + +export const handler = async (argv: Arguments) => { + const { config } = argv; + + const kind = argv.kind as string; + const commitsDuration = { + seconds: Long.fromNumber(argv.commitsDuration as number), + nanos: 0 + }; + const revealsDuration = { + seconds: Long.fromNumber(argv.revealsDuration as number), + nanos: 0 + }; + const commitFee = { + denom: DENOM, + amount: argv.commitFee as string + }; + const revealFee = { + denom: DENOM, + amount: argv.revealFee as string + }; + const minimumBid = { + denom: DENOM, + amount: argv.minimumBid as string + }; + const maxPrice = { + denom: DENOM, + amount: argv.maxPrice as string + }; + const numProviders = argv.numProviders as number; + + assert(kind, 'Invalid auction kind.'); + assert(commitsDuration, 'Invalid commits duration.'); + assert(revealsDuration, 'Invalid reveals duration.'); + assert(commitFee, 'Invalid commit fee.'); + assert(revealFee, 'Invalid reveal fee.'); + + const { services: { registry: registryConfig } } = getConfig(config as string); + const { rpcEndpoint, gqlEndpoint, privateKey, chainId } = getConnectionInfo(argv, registryConfig); + assert(rpcEndpoint, 'Invalid registry RPC endpoint.'); + assert(gqlEndpoint, 'Invalid registry GQL endpoint.'); + assert(privateKey, 'Invalid Transaction Key.'); + assert(chainId, 'Invalid registry Chain ID.'); + + const account = new Account(Buffer.from(privateKey, 'hex')); + await account.init(); + const signer = account.address; + + const gasPrice = getGasPrice(argv, registryConfig); + const registry = new Registry(gqlEndpoint, rpcEndpoint, { chainId, gasPrice }); + + const fee = getGasAndFees(argv, registryConfig); + + let result: MsgCreateAuctionResponse; + if (kind === 'vickrey') { + result = await registry.createAuction({ commitsDuration, revealsDuration, commitFee, revealFee, minimumBid, signer }, privateKey, fee); + } else { + result = await registry.createProviderAuction({ commitsDuration, revealsDuration, commitFee, revealFee, signer, maxPrice, numProviders }, privateKey, fee); + } + const jsonString = `{"auctionId":"${result.auction?.id}"}`; + + txOutput(result, jsonString, argv.output, argv.verbose); +};