laconic-sdk/src/messages/registry.ts
2022-12-27 12:17:02 +05:30

404 lines
8.0 KiB
TypeScript

import {
generateTypes,
} from '@tharsis/eip712'
import {
Chain,
Sender,
Fee,
} from '@tharsis/transactions'
import * as registryTx from '../proto/vulcanize/registry/v1beta1/tx'
import * as registry from '../proto/vulcanize/registry/v1beta1/registry'
import { createTx } from './util'
import { Payload } from '../types'
const MSG_RESERVE_AUTHORITY_TYPES = {
MsgValue: [
{ name: 'name', type: 'string' },
{ name: 'signer', type: 'string' },
{ name: 'owner', type: 'string' },
],
}
const MSG_SET_NAME_TYPES = {
MsgValue: [
{ name: 'crn', type: 'string' },
{ name: 'cid', type: 'string' },
{ name: 'signer', type: 'string' },
],
}
const MSG_SET_RECORD_TYPES = {
MsgValue: [
{ name: 'bond_id', type: 'string' },
{ name: 'signer', type: 'string' },
{ name: 'payload', type: 'TypePayload' },
],
TypePayload: [
{ name: 'record', type: 'TypePayloadRecord' },
{ name: 'signatures', type: 'TypePayloadSignatures[]' },
],
TypePayloadRecord: [
{ name: 'id', type: 'string' },
{ name: 'bond_id', type: 'string' },
{ name: 'create_time', type: 'string' },
{ name: 'expiry_time', type: 'string' },
{ name: 'deleted', type: 'bool' },
{ name: 'attributes', type: 'TypePayloadRecordAttributes' },
],
TypePayloadRecordAttributes: [
{ name: 'type_url', type: 'string' },
{ name: 'value', type: 'uint8[]' },
],
TypePayloadSignatures: [
{ name: 'sig', type: 'string' },
{ name: 'pub_key', type: 'string' }
],
}
const MSG_SET_AUTHORITY_BOND_TYPES = {
MsgValue: [
{ name: 'name', type: 'string' },
{ name: 'bond_id', type: 'string' },
{ name: 'signer', type: 'string' },
],
}
const MSG_DELETE_NAME_TYPES = {
MsgValue: [
{ name: 'crn', type: 'string' },
{ name: 'signer', type: 'string' },
],
}
export const parseMsgSetRecordResponse = (data: string) => {
const responseBytes = Buffer.from(data, 'hex')
// TODO: Decode response using protobuf.
// const msgSetRecordResponse = nameserviceTx.vulcanize.nameservice.v1beta1.MsgSetRecordResponse.deserialize(responseBytes);
// return msgSetRecordResponse.toObject();
// Workaround as proto based decoding is not working.
const [_, id] = responseBytes.toString().split(';')
return { id }
}
export const NAMESERVICE_ERRORS = [
'Name already reserved.',
'Authority bond not found.',
'Name authority not found.',
'Access denied.',
]
export interface MessageMsgReserveAuthority {
name: string
owner: string
}
export interface MessageMsgSetName {
crn: string
cid: string
}
export interface MessageMsgSetRecord {
bondId: string
payload: Payload
}
export interface MessageMsgSetAuthorityBond {
name: string
bondId: string
}
export interface MessageMsgDeleteName {
crn: string
}
export function createTxMsgReserveAuthority(
chain: Chain,
sender: Sender,
fee: Fee,
memo: string,
params: MessageMsgReserveAuthority,
) {
const types = generateTypes(MSG_RESERVE_AUTHORITY_TYPES)
const msg = createMsgReserveAuthority(
params.name,
sender.accountAddress,
params.owner
)
const msgCosmos = protoCreateMsgReserveAuthority(
params.name,
sender.accountAddress,
params.owner
)
return createTx(chain, sender, fee, memo, types, msg, msgCosmos)
}
export function createTxMsgSetName(
chain: Chain,
sender: Sender,
fee: Fee,
memo: string,
params: MessageMsgSetName,
) {
const types = generateTypes(MSG_SET_NAME_TYPES)
const msg = createMsgSetName(
params.crn,
params.cid,
sender.accountAddress
)
const msgCosmos = protoCreateMsgSetName(
params.crn,
params.cid,
sender.accountAddress
)
return createTx(chain, sender, fee, memo, types, msg, msgCosmos)
}
export function createTxMsgSetRecord(
chain: Chain,
sender: Sender,
fee: Fee,
memo: string,
params: MessageMsgSetRecord,
) {
const types = generateTypes(MSG_SET_RECORD_TYPES)
const msg = createMsgSetRecord(
params.bondId,
params.payload,
sender.accountAddress
)
const msgCosmos = protoCreateMsgSetRecord(
params.bondId,
params.payload,
sender.accountAddress
)
return createTx(chain, sender, fee, memo, types, msg, msgCosmos)
}
export function createTxMsgSetAuthorityBond(
chain: Chain,
sender: Sender,
fee: Fee,
memo: string,
params: MessageMsgSetAuthorityBond,
) {
const types = generateTypes(MSG_SET_AUTHORITY_BOND_TYPES)
const msg = createMsgSetAuthorityBond(
params.name,
params.bondId,
sender.accountAddress
)
const msgCosmos = protoCreateMsgSetAuthorityBond(
params.name,
params.bondId,
sender.accountAddress
)
return createTx(chain, sender, fee, memo, types, msg, msgCosmos)
}
export function createTxMsgDeleteName(
chain: Chain,
sender: Sender,
fee: Fee,
memo: string,
params: MessageMsgDeleteName,
) {
const types = generateTypes(MSG_DELETE_NAME_TYPES)
const msg = createMsgDeleteName(
params.crn,
sender.accountAddress
)
const msgCosmos = protoCreateMsgDeleteName(
params.crn,
sender.accountAddress
)
return createTx(chain, sender, fee, memo, types, msg, msgCosmos)
}
function createMsgReserveAuthority(
name: string,
signer: string,
owner: string
) {
return {
type: 'registry/ReserveAuthority',
value: {
name,
signer,
owner
},
}
}
const protoCreateMsgReserveAuthority = (
name: string,
signer: string,
owner: string,
) => {
const reserveAuthorityMessage = new registryTx.vulcanize.registry.v1beta1.MsgReserveAuthority({
name,
signer,
owner
})
return {
message: reserveAuthorityMessage,
path: 'vulcanize.registry.v1beta1.MsgReserveAuthority',
}
}
function createMsgSetName(
crn: string,
cid: string,
signer: string
) {
return {
type: 'registry/SetName',
value: {
crn,
cid,
signer
},
}
}
const protoCreateMsgSetName = (
crn: string,
cid: string,
signer: string
) => {
const setNameMessage = new registryTx.vulcanize.registry.v1beta1.MsgSetName({
crn,
cid,
signer,
})
return {
message: setNameMessage,
path: 'vulcanize.registry.v1beta1.MsgSetName',
}
}
function createMsgSetRecord(
bondId: string,
payload: Payload,
signer: string
) {
return {
type: 'registry/SetRecord',
value: {
bond_id: bondId,
signer,
payload: payload.serialize()
},
}
}
const protoCreateMsgSetRecord = (
bondId: string,
payloadData: Payload,
signer: string
) => {
const record = new registry.vulcanize.registry.v1beta1.Record(payloadData.record.serialize())
const signatures = payloadData.signatures.map(
signature => new registry.vulcanize.registry.v1beta1.Signature(
signature.serialize()
)
)
const payload = new registryTx.vulcanize.registry.v1beta1.Payload({
record,
signatures
})
const setNameMessage = new registryTx.vulcanize.registry.v1beta1.MsgSetRecord({
bond_id: bondId,
signer,
payload
})
return {
message: setNameMessage,
path: 'vulcanize.registry.v1beta1.MsgSetRecord',
}
}
function createMsgSetAuthorityBond(
name: string,
bondId: string,
signer: string
) {
return {
type: 'registry/SetAuthorityBond',
value: {
name,
bond_id: bondId,
signer
},
}
}
const protoCreateMsgSetAuthorityBond = (
name: string,
bondId: string,
signer: string
) => {
const setAuthorityBondMessage = new registryTx.vulcanize.registry.v1beta1.MsgSetAuthorityBond({
name,
bond_id: bondId,
signer,
})
return {
message: setAuthorityBondMessage,
path: 'vulcanize.registry.v1beta1.MsgSetAuthorityBond',
}
}
function createMsgDeleteName(
crn: string,
signer: string
) {
return {
type: 'registry/DeleteAuthority',
value: {
crn,
signer
},
}
}
const protoCreateMsgDeleteName = (
crn: string,
signer: string
) => {
const deleteNameAutorityMessage = new registryTx.vulcanize.registry.v1beta1.MsgDeleteNameAuthority({
crn,
signer,
})
return {
message: deleteNameAutorityMessage,
path: 'vulcanize.registry.v1beta1.MsgDeleteNameAuthority',
}
}