diff --git a/src/app/approve/approve.component.ts b/src/app/approve/approve.component.ts index b8ed327d..66edfeeb 100644 --- a/src/app/approve/approve.component.ts +++ b/src/app/approve/approve.component.ts @@ -37,6 +37,7 @@ import { TransactionMetadataUpdateNFT, TransactionMetadataUpdateProfile, TransactionSpendingLimit, + TransactionMetadataRegisterAsValidator, } from '../../lib/deso/transaction'; import { ExtraData } from '../../types/identity'; import { AccountService } from '../account.service'; @@ -588,6 +589,10 @@ export class ApproveComponent implements OnInit { description = `unknown messaging action on ${messageType} to ${recipient}`; } break; + case TransactionMetadataRegisterAsValidator: + // TODO: Do we want any additional details in the approve component? + description = 'register as a validator'; + break; } // Set the transaction description based on the description populated with public keys. diff --git a/src/app/identity.service.ts b/src/app/identity.service.ts index 21d75fac..46e487c6 100644 --- a/src/app/identity.service.ts +++ b/src/app/identity.service.ts @@ -35,6 +35,7 @@ import { TransactionMetadataUpdateGlobalParams, TransactionMetadataUpdateNFT, TransactionMetadataUpdateProfile, + TransactionMetadataRegisterAsValidator, } from '../lib/deso/transaction'; import { SwalHelper } from '../lib/helpers/swal-helper'; import { AccessLevel, PublicUserInfo } from '../types/identity'; @@ -518,6 +519,7 @@ export class IdentityService { case TransactionMetadataDAOCoin: case TransactionMetadataTransferDAOCoin: case TransactionMetadataDAOCoinLimitOrder: + case TransactionMetadataRegisterAsValidator: return AccessLevel.Full; case TransactionMetadataFollow: diff --git a/src/lib/bindata/transcoders.ts b/src/lib/bindata/transcoders.ts index 5974e7ab..e5fbf15d 100644 --- a/src/lib/bindata/transcoders.ts +++ b/src/lib/bindata/transcoders.ts @@ -50,6 +50,31 @@ export const VarBuffer: Transcoder = { write: (bytes) => Buffer.concat([uvarint64ToBuf(bytes.length), bytes]), }; +export const VarBufferArray: Transcoder = { + read: (bytes) => { + let [count, buffer] = bufToUvarint64(bytes); + + const result = []; + for (let i = 0; i < count; i++) { + let size; + [size, buffer] = bufToUvarint64(buffer); + result.push(buffer.slice(0, size)); + buffer = buffer.slice(size); + } + + return [result, buffer]; + }, + write: (buffers) => { + const count = uvarint64ToBuf(buffers.length); + return Buffer.concat([ + count, + ...buffers.map((buffer) => + Buffer.concat([uvarint64ToBuf(buffer.length), buffer]) + ), + ]); + }, +}; + export const TransactionNonceTranscoder: Transcoder = { read: (bytes) => { return TransactionNonce.fromBytes(bytes) as [TransactionNonce, Buffer]; diff --git a/src/lib/deso/transaction.ts b/src/lib/deso/transaction.ts index cd7416bd..6a8b18fa 100644 --- a/src/lib/deso/transaction.ts +++ b/src/lib/deso/transaction.ts @@ -11,6 +11,7 @@ import { Uint8, Uvarint64, VarBuffer, + VarBufferArray, } from '../bindata/transcoders'; export class TransactionInput extends BinaryRecord { @@ -581,6 +582,31 @@ export class TransactionMetadataNewMessage extends BinaryRecord { newMessageOperation: number = 0; } +export class TransactionMetadataRegisterAsValidator extends TransactionMetadata { + @Transcode(VarBufferArray) + domains: Buffer[] = []; + + @Transcode(Boolean) + disableDelegatedStake: boolean = false; + + @Transcode(Uvarint64) + delegatedStakeCommissionBasisPoints: number = 0; + + // TODO: Technically this is a bls public key, + // but under the hood it's really just a byte array. + // The challenge is converting this into something human + // readable in the UI. + @Transcode(VarBuffer) + votingPublicKey: Buffer = Buffer.alloc(0); + + // TODO: Technically this is a bls signature, + // but under the hood it's really just a byte array. + // The challenge is converting this into something human + // readable in the UI. + @Transcode(VarBuffer) + votingAuthorization: Buffer = Buffer.alloc(0); +} + export const TransactionTypeMetadataMap = { 1: TransactionMetadataBlockReward, 2: TransactionMetadataBasicTransfer, @@ -614,6 +640,7 @@ export const TransactionTypeMetadataMap = { 31: TransactionMetadataAccessGroup, 32: TransactionMetadataAccessGroupMembers, 33: TransactionMetadataNewMessage, + 34: TransactionMetadataRegisterAsValidator, }; export class Transaction extends BinaryRecord {