Commit 86904fb2 authored by Will Cory's avatar Will Cory

fix write

parent 87efbc2a
......@@ -6,7 +6,7 @@ import { readOptionsValidators, ReadOptions } from './commands/read'
import * as logger from './lib/logger'
// @ts-ignore it's mad about me importing something not in tsconfig.includes
import packageJson from '../package.json'
import { writeOptionsValidators } from './commands/write'
import { WriteOptions, writeOptionsValidators } from './commands/write'
const cli = cac('atst')
......@@ -51,6 +51,9 @@ cli
'--private-key <string>',
writeOptionsValidators.privateKey.description!
)
.option('--data-type [string]', readOptionsValidators.dataType.description!, {
default: writeOptionsValidators.dataType.parse(undefined),
})
.option('--about <string>', writeOptionsValidators.about.description!)
.option('--key <string>', writeOptionsValidators.key.description!)
.option('--value <string>', writeOptionsValidators.value.description!)
......@@ -68,6 +71,22 @@ cli
() =>
`atst write --key "optimist.base-uri" --about 0x2335022c740d17c2837f9C884Bfe4fFdbf0A95D5 --value "my attestation" --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --rpc-url http://localhost:8545`
)
.action(async (options: WriteOptions) => {
const { write } = await import('./commands/write')
// TODO use the native api to do this instead of parsing the raw args
// by default options parses addresses as numbers without precision
// we should use the args parsing library to do this directly
// but for now I didn't bother to figure out how to do that
const { rawArgs } = cli
const privateKey = rawArgs[rawArgs.indexOf('--private-key') + 1] as Address
const about = rawArgs[rawArgs.indexOf('--about') + 1] as Address
const contract = rawArgs.includes('--contract')
? (rawArgs[rawArgs.indexOf('--contract') + 1] as Address)
: options.contract
await write({ ...options, about, privateKey, contract })
})
cli.help()
cli.version(packageJson.version)
......
......@@ -9,6 +9,7 @@ import { ATTESTATION_STATION_ADDRESS } from '../constants/attestationStationAddr
import { DEFAULT_RPC_URL } from '../constants/defaultRpcUrl'
import { prepareWriteAttestation } from '../lib/prepareWriteAttestation'
import { writeAttestation } from '../lib/writeAttestation'
import { dataTypeOptionValidator } from '../types/DataTypeOption'
const zodAddress = () =>
z
......@@ -27,6 +28,7 @@ export const writeOptionsValidators = {
.string()
.describe('Key of the attestation either as string or hex number'),
value: zodAttestation().describe('Attestation value').default(''),
dataType: dataTypeOptionValidator,
rpcUrl: z
.string()
.url()
......@@ -80,11 +82,29 @@ export const write = async (options: WriteOptions) => {
}),
})
const castAsDataType = (value: any) => {
if (parsedOptions.dataType === 'string') {
return value
} else if (parsedOptions.dataType === 'number') {
return Number(value)
} else if (parsedOptions.dataType === 'bool') {
return Boolean(value)
} else if (parsedOptions.dataType === 'bytes') {
return value
} else if (parsedOptions.dataType === 'address') {
return value
} else {
throw new Error(
`Unrecognized data type ${parsedOptions.dataType satisfies never}`
)
}
}
try {
const preparedTx = await prepareWriteAttestation(
parsedOptions.about,
parsedOptions.key,
parsedOptions.value,
castAsDataType(parsedOptions.value),
network.chainId
)
const result = await writeAttestation(preparedTx)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment