diff --git a/packages/mainsail/source/client.service.ts b/packages/mainsail/source/client.service.ts index 264acc1f..2ecee69b 100644 --- a/packages/mainsail/source/client.service.ts +++ b/packages/mainsail/source/client.service.ts @@ -181,11 +181,11 @@ export class ClientService extends Services.AbstractClientService { }; const mappings: Record = { + address: "address", cursor: "page", limit: "limit", memo: "vendorField", orderBy: "orderBy", - address: "address", recipientId: "recipientId", senderId: "senderId", senderPublicKey: "senderPublicKey", @@ -219,14 +219,6 @@ export class ClientService extends Services.AbstractClientService { type: Enums.TransactionType.DelegateResignation, typeGroup: Enums.TransactionTypeGroup.Core, }, - usernameRegistration: { - type: Enums.TransactionType.UsernameRegistration, - typeGroup: Enums.TransactionTypeGroup.Core, - }, - usernameResignation: { - type: Enums.TransactionType.UsernameResignation, - typeGroup: Enums.TransactionTypeGroup.Core, - }, multiPayment: { type: Enums.TransactionType.MultiPayment, typeGroup: Enums.TransactionTypeGroup.Core, @@ -235,14 +227,18 @@ export class ClientService extends Services.AbstractClientService { type: Enums.TransactionType.MultiSignature, typeGroup: Enums.TransactionTypeGroup.Core, }, - secondSignature: { - type: Enums.TransactionType.SecondSignature, - typeGroup: Enums.TransactionTypeGroup.Core, - }, transfer: { type: Enums.TransactionType.Transfer, typeGroup: Enums.TransactionTypeGroup.Core, }, + usernameRegistration: { + type: Enums.TransactionType.UsernameRegistration, + typeGroup: Enums.TransactionTypeGroup.Core, + }, + usernameResignation: { + type: Enums.TransactionType.UsernameResignation, + typeGroup: Enums.TransactionTypeGroup.Core, + }, vote: { type: Enums.TransactionType.Vote, typeGroup: Enums.TransactionTypeGroup.Core, diff --git a/packages/mainsail/source/confirmed-transaction.dto.ts b/packages/mainsail/source/confirmed-transaction.dto.ts index 9dfe5e34..bb23a3ef 100644 --- a/packages/mainsail/source/confirmed-transaction.dto.ts +++ b/packages/mainsail/source/confirmed-transaction.dto.ts @@ -91,7 +91,7 @@ export class ConfirmedTransactionData extends DTO.AbstractConfirmedTransactionDa } public override isSecondSignature(): boolean { - return TransactionTypeService.isSecondSignature(this.data); + throw new Exceptions.NotImplemented(this.constructor.name, this.isSecondSignature.name); } public override isUsernameRegistration(): boolean { diff --git a/packages/mainsail/source/crypto/enums.ts b/packages/mainsail/source/crypto/enums.ts index 27502326..90ebddc7 100644 --- a/packages/mainsail/source/crypto/enums.ts +++ b/packages/mainsail/source/crypto/enums.ts @@ -1,6 +1,5 @@ export enum TransactionType { Transfer = 0, - SecondSignature = 1, DelegateRegistration = 2, Vote = 3, MultiSignature = 4, diff --git a/packages/mainsail/source/crypto/interfaces/transactions.ts b/packages/mainsail/source/crypto/interfaces/transactions.ts index debd5f6c..de15d244 100644 --- a/packages/mainsail/source/crypto/interfaces/transactions.ts +++ b/packages/mainsail/source/crypto/interfaces/transactions.ts @@ -38,7 +38,6 @@ export interface ITransactionAsset { votes?: string[]; multiSignatureLegacy?: IMultiSignatureLegacyAsset; multiSignature?: IMultiSignatureAsset; - ipfs?: string; payments?: IMultiPaymentItem[]; } @@ -63,7 +62,6 @@ export interface ITransactionData { id?: string; signature?: string; - secondSignature?: string; signSignature?: string; signatures?: string[]; @@ -94,14 +92,11 @@ export interface ITransactionJson { id?: string; signature?: string; - secondSignature?: string; signSignature?: string; signatures?: string[]; blockId?: string; sequence?: number; - - ipfsHash?: string; } export interface ISchemaValidationResult { @@ -139,6 +134,5 @@ export interface ISerializeOptions { acceptLegacyVersion?: boolean; disableVersionCheck?: boolean; excludeSignature?: boolean; - excludeSecondSignature?: boolean; excludeMultiSignature?: boolean; } diff --git a/packages/mainsail/source/crypto/networks/mainnet/milestones.ts b/packages/mainsail/source/crypto/networks/mainnet/milestones.ts index 9b333f6b..8c6f9d8b 100644 --- a/packages/mainsail/source/crypto/networks/mainnet/milestones.ts +++ b/packages/mainsail/source/crypto/networks/mainnet/milestones.ts @@ -13,8 +13,6 @@ export const milestones = [ staticFees: { delegateRegistration: 2_500_000_000, delegateResignation: 2_500_000_000, - usernameRegistration: 2_500_000_000, - usernameResignation: 2_500_000_000, htlcClaim: 0, htlcLock: 10_000_000, htlcRefund: 0, @@ -23,6 +21,8 @@ export const milestones = [ multiSignature: 500_000_000, secondSignature: 500_000_000, transfer: 10_000_000, + usernameRegistration: 2_500_000_000, + usernameResignation: 2_500_000_000, vote: 100_000_000, }, }, diff --git a/packages/mainsail/source/crypto/transactions/deserializer.ts b/packages/mainsail/source/crypto/transactions/deserializer.ts index 501dcccf..8e30307d 100644 --- a/packages/mainsail/source/crypto/transactions/deserializer.ts +++ b/packages/mainsail/source/crypto/transactions/deserializer.ts @@ -80,12 +80,6 @@ export class Deserializer { return marker === 255; }; - // Second Signature - if (buf.getRemainderLength() && !beginningMultiSignature()) { - const secondSignatureLength: number = currentSignatureLength(); - transaction.secondSignature = buf.readBuffer(secondSignatureLength).toString("hex"); - } - // Multi Signatures if (buf.getRemainderLength() && beginningMultiSignature()) { buf.jump(1); @@ -106,17 +100,13 @@ export class Deserializer { transaction.signature = buf.readBuffer(64).toString("hex"); } - if (canReadNonMultiSignature()) { - transaction.secondSignature = buf.readBuffer(64).toString("hex"); - } - if (buf.getRemainderLength()) { if (buf.getRemainderLength() % 65 === 0) { transaction.signatures = []; const count: number = buf.getRemainderLength() / 65; const publicKeyIndexes: { [index: number]: boolean } = {}; - for (let i = 0; i < count; i++) { + for (let index = 0; index < count; index++) { const multiSignaturePart: string = buf.readBuffer(65).toString("hex"); const publicKeyIndex: number = Number.parseInt(multiSignaturePart.slice(0, 2), 16); diff --git a/packages/mainsail/source/crypto/transactions/serializer.ts b/packages/mainsail/source/crypto/transactions/serializer.ts index 2dc1da6d..d5654142 100644 --- a/packages/mainsail/source/crypto/transactions/serializer.ts +++ b/packages/mainsail/source/crypto/transactions/serializer.ts @@ -90,12 +90,6 @@ export class Serializer { buf.writeBuffer(Buffer.from(transaction.signature, "hex")); } - const secondSignature: string | undefined = transaction.secondSignature || transaction.signSignature; - - if (secondSignature && !options.excludeSecondSignature) { - buf.writeBuffer(Buffer.from(secondSignature, "hex")); - } - if (transaction.signatures && !options.excludeMultiSignature) { buf.writeBuffer(Buffer.from(transaction.signatures.join(""), "hex")); } diff --git a/packages/mainsail/source/crypto/transactions/signer.ts b/packages/mainsail/source/crypto/transactions/signer.ts index 24eb1e8f..393f03f7 100644 --- a/packages/mainsail/source/crypto/transactions/signer.ts +++ b/packages/mainsail/source/crypto/transactions/signer.ts @@ -6,8 +6,8 @@ import { Utils } from "./utils.js"; export class Signer { public static sign(transaction: ITransactionData, keys: IKeyPair, options?: ISerializeOptions): string { - if (!options || (options.excludeSignature === undefined && options.excludeSecondSignature === undefined)) { - options = { excludeSecondSignature: true, excludeSignature: true, ...options }; + if (!options || options.excludeSignature === undefined) { + options = { excludeSignature: true, ...options }; } const hash: Buffer = Utils.toHash(transaction, options); @@ -20,17 +20,6 @@ export class Signer { return signature; } - public static secondSign(transaction: ITransactionData, keys: IKeyPair): string { - const hash: Buffer = Utils.toHash(transaction, { excludeSecondSignature: true }); - const signature: string = Hash.signSchnorr(hash, keys); - - if (!transaction.secondSignature) { - transaction.secondSignature = signature; - } - - return signature; - } - public static async multiSign( transaction: MainsailContracts.Crypto.TransactionData, keys: IKeyPair, diff --git a/packages/mainsail/source/crypto/transactions/types/schemas.ts b/packages/mainsail/source/crypto/transactions/types/schemas.ts index 2076ffc9..ffcc622e 100644 --- a/packages/mainsail/source/crypto/transactions/types/schemas.ts +++ b/packages/mainsail/source/crypto/transactions/types/schemas.ts @@ -1,6 +1,7 @@ -import { TransactionType } from "../../enums.js"; import deepmerge from "deepmerge"; +import { TransactionType } from "../../enums.js"; + const signedTransaction = { anyOf: [ { required: ["id", "signature"] }, @@ -23,11 +24,9 @@ export const transactionBaseSchema: Record = { id: { anyOf: [{ $ref: "transactionId" }, { type: "null" }] }, network: { $ref: "networkByte" }, nonce: { bignumber: { minimum: 0 } }, - secondSignature: { $ref: "alphanumeric" }, senderPublicKey: { $ref: "publicKey" }, signSignature: { $ref: "alphanumeric" }, signature: { $ref: "alphanumeric" }, - version: { enum: [1, 2] }, signatures: { additionalItems: false, items: { allOf: [{ maxLength: 130, minLength: 130 }, { $ref: "alphanumeric" }] }, @@ -36,8 +35,9 @@ export const transactionBaseSchema: Record = { type: "array", uniqueItems: true, }, - timestamp: { type: "integer", minimum: 0 }, + timestamp: { minimum: 0, type: "integer" }, typeGroup: { minimum: 0, type: "integer" }, + version: { enum: [1, 2] }, }, then: { required: ["type", "senderPublicKey", "fee", "amount", "timestamp"] }, type: "object", @@ -70,32 +70,6 @@ export const transfer = extend(transactionBaseSchema, { required: ["recipientId"], }); -export const secondSignature = extend(transactionBaseSchema, { - $id: "secondSignature", - properties: { - amount: { bignumber: { maximum: 0, minimum: 0 } }, - asset: { - properties: { - signature: { - properties: { - publicKey: { - $ref: "publicKey", - }, - }, - required: ["publicKey"], - type: "object", - }, - }, - required: ["signature"], - type: "object", - }, - fee: { bignumber: { minimum: 1 } }, - secondSignature: { type: "null" }, - type: { transactionType: TransactionType.SecondSignature }, - }, - required: ["asset"], -}); - export const delegateRegistration = extend(transactionBaseSchema, { $id: "delegateRegistration", properties: { @@ -150,8 +124,8 @@ export const vote = extend(transactionBaseSchema, { votes: { additionalItems: false, items: { $ref: "walletVote" }, - minItems: 1, maxItems: 2, + minItems: 1, type: "array", }, }, @@ -180,10 +154,10 @@ export const multiSignature = extend(transactionBaseSchema, { }, publicKeys: { additionalItems: false, - minItems: 1, items: { $ref: "publicKey" }, - type: "array", maxItems: 16, + minItems: 1, + type: "array", uniqueItems: true, }, }, @@ -220,24 +194,24 @@ export const multiSignatureLegacy = extend(transactionBaseSchemaNoSignatures, { properties: { multiSignatureLegacy: { properties: { - lifetime: { - minimum: 1, - type: "integer", - maximum: 72, - }, keysgroup: { - minItems: 1, - type: "array", additionalItems: false, - maxItems: 16, items: { - allOf: [{ minimum: 67, type: "string", maximum: 67, transform: ["toLowerCase"] }], + allOf: [{ maximum: 67, minimum: 67, transform: ["toLowerCase"], type: "string" }], }, + maxItems: 16, + minItems: 1, + type: "array", }, - min: { - type: "integer", + lifetime: { + maximum: 72, minimum: 1, + type: "integer", + }, + min: { maximum: { $data: "1/keysgroup/length" }, + minimum: 1, + type: "integer", }, }, required: ["keysgroup", "min", "lifetime"], @@ -270,11 +244,11 @@ export const multiPayment = extend(transactionBaseSchema, { payments: { additionalItems: false, items: { - required: ["amount", "recipientId"], properties: { amount: { bignumber: { minimum: 1 } }, recipientId: { $ref: "address" }, }, + required: ["amount", "recipientId"], type: "object", }, minItems: 2, diff --git a/packages/mainsail/source/crypto/transactions/types/transaction.ts b/packages/mainsail/source/crypto/transactions/types/transaction.ts index 976cc18c..3c7f746b 100644 --- a/packages/mainsail/source/crypto/transactions/types/transaction.ts +++ b/packages/mainsail/source/crypto/transactions/types/transaction.ts @@ -49,10 +49,6 @@ export abstract class Transaction implements ITransaction { return Verifier.verify(this.data, options); } - public verifySecondSignature(publicKey: string): boolean { - return Verifier.verifySecondSignature(this.data, publicKey); - } - public verifySchema(): ISchemaValidationResult { return Verifier.verifySchema(this.data); } diff --git a/packages/mainsail/source/crypto/transactions/verifier.ts b/packages/mainsail/source/crypto/transactions/verifier.ts index 5c761d9f..8399e525 100644 --- a/packages/mainsail/source/crypto/transactions/verifier.ts +++ b/packages/mainsail/source/crypto/transactions/verifier.ts @@ -1,17 +1,17 @@ +import { DateTime } from "@ardenthq/sdk-intl"; + import { DuplicateParticipantInMultiSignatureError, InvalidMultiSignatureAssetError } from "../errors.js"; +import { Hash } from "../hash.js"; import { IMultiSignatureAsset, ISchemaValidationResult, ITransactionData, IVerifyOptions, } from "../interfaces/index.js"; - -import { DateTime } from "@ardenthq/sdk-intl"; -import { Hash } from "../hash.js"; -import { TransactionTypeFactory } from "./types/factory.js"; -import { Utils } from "./utils.js"; import { configManager } from "../managers/index.js"; import { validator } from "../validation/index.js"; +import { TransactionTypeFactory } from "./types/factory.js"; +import { Utils } from "./utils.js"; export class Verifier { public static verify(data: ITransactionData, options?: IVerifyOptions): boolean { @@ -22,24 +22,6 @@ export class Verifier { return Verifier.verifyHash(data, options?.disableVersionCheck); } - public static verifySecondSignature( - transaction: ITransactionData, - publicKey: string, - options?: IVerifyOptions, - ): boolean { - const secondSignature: string | undefined = transaction.secondSignature || transaction.signSignature; - - if (!secondSignature) { - return false; - } - - const hash: Buffer = Utils.toHash(transaction, { - disableVersionCheck: options?.disableVersionCheck, - excludeSecondSignature: true, - }); - return this.internalVerifySignature(hash, secondSignature, publicKey); - } - public static verifySignatures(transaction: ITransactionData, multiSignature: IMultiSignatureAsset): boolean { if (!multiSignature) { throw new InvalidMultiSignatureAssetError(); @@ -50,7 +32,6 @@ export class Verifier { const hash: Buffer = Utils.toHash(transaction, { excludeMultiSignature: true, - excludeSecondSignature: true, excludeSignature: true, }); @@ -97,7 +78,6 @@ export class Verifier { const hash: Buffer = Utils.toHash(data, { disableVersionCheck, - excludeSecondSignature: true, excludeSignature: true, }); diff --git a/packages/mainsail/source/multi-signature.signer.ts b/packages/mainsail/source/multi-signature.signer.ts index 222a0dcf..a093d357 100644 --- a/packages/mainsail/source/multi-signature.signer.ts +++ b/packages/mainsail/source/multi-signature.signer.ts @@ -93,10 +93,6 @@ export class MultiSignatureSigner { Transactions.Signer.sign(transaction, signingKeys); } - if (confirmKeys) { - Transactions.Signer.secondSign(transaction, confirmKeys); - } - if (signatory.actsWithLedger()) { transaction.signature = await this.#signWithLedger(transaction, signatory); } @@ -170,7 +166,6 @@ export class MultiSignatureSigner { // @ts-ignore Transactions.Serializer.getBytes(transaction, { excludeMultiSignature, - excludeSecondSignature: true, excludeSignature: true, }), ); diff --git a/packages/mainsail/source/signed-transaction.dto.ts b/packages/mainsail/source/signed-transaction.dto.ts index c4eec11a..a0914259 100644 --- a/packages/mainsail/source/signed-transaction.dto.ts +++ b/packages/mainsail/source/signed-transaction.dto.ts @@ -2,8 +2,8 @@ import { Contracts, DTO, Exceptions, IoC } from "@ardenthq/sdk"; import { BigNumber } from "@ardenthq/sdk-helpers"; import { DateTime } from "@ardenthq/sdk-intl"; import { Utils } from "@mainsail/crypto-transaction"; - import { Application } from "@mainsail/kernel"; + import { BindingType } from "./coin.contract.js"; import { Hash } from "./crypto/hash.js"; import { TransactionTypeService } from "./transaction-type.service.js"; @@ -59,7 +59,7 @@ export class SignedTransactionData } public override isSecondSignature(): boolean { - return TransactionTypeService.isSecondSignature(this.signedData); + return false; } public override isUsernameRegistration(): boolean { @@ -145,7 +145,7 @@ export class SignedTransactionData const signatures: string[] = this.signedData.signatures ?? ([] as string[]); for (const signature of signatures) { - const publicKeyIndex: number = parseInt(signature.slice(0, 2), 16); + const publicKeyIndex: number = Number.parseInt(signature.slice(0, 2), 16); const partialSignature: string = signature.slice(2, 130); const publicKey: string = transaction.multiSignature.publicKeys[publicKeyIndex]; diff --git a/packages/mainsail/source/transaction-type.service.ts b/packages/mainsail/source/transaction-type.service.ts index 2db942ec..5786bf3d 100644 --- a/packages/mainsail/source/transaction-type.service.ts +++ b/packages/mainsail/source/transaction-type.service.ts @@ -8,7 +8,7 @@ export class TransactionTypeService { } public static isSecondSignature(data: TransactionData): boolean { - return TransactionTypeService.#typeGroup(data) === 1 && data.type === 1; + throw new Exceptions.NotImplemented(this.constructor.name, this.isSecondSignature.name); } public static isDelegateRegistration(data: TransactionData): boolean { diff --git a/packages/mainsail/source/transaction.service.ts b/packages/mainsail/source/transaction.service.ts index 09232a1c..1bd5524e 100644 --- a/packages/mainsail/source/transaction.service.ts +++ b/packages/mainsail/source/transaction.service.ts @@ -7,9 +7,9 @@ import { Application } from "@mainsail/kernel"; import { BindingType } from "./coin.contract.js"; import { applyCryptoConfiguration } from "./config.js"; import { Identities, Interfaces, Transactions } from "./crypto/index.js"; +import { BuilderFactory } from "./crypto/transactions/index.js"; import { MultiSignatureSigner } from "./multi-signature.signer.js"; import { Request } from "./request.js"; -import { BuilderFactory } from "./crypto/transactions/index.js"; export class TransactionService extends Services.AbstractTransactionService { readonly #ledgerService!: Services.LedgerService; @@ -333,7 +333,6 @@ export class TransactionService extends Services.AbstractTransactionService { transaction.data.signature = await this.#ledgerService.signTransaction( input.signatory.signingKey(), Transactions.Serializer.getBytes(transaction.data, { - excludeSecondSignature: true, excludeSignature: true, }), ); diff --git a/packages/mainsail/source/wallet.dto.ts b/packages/mainsail/source/wallet.dto.ts index 0ac5b38f..318a4a3b 100644 --- a/packages/mainsail/source/wallet.dto.ts +++ b/packages/mainsail/source/wallet.dto.ts @@ -72,10 +72,6 @@ export class WalletData extends DTO.AbstractWalletData implements Contracts.Wall return !!this.#getProperty(["multiSignature", "attributes.multiSignature"]); } - public override isSecondSignature(): boolean { - return !!this.#getProperty(["secondPublicKey", "attributes.secondPublicKey"]); - } - #getProperty(keys: string[]): T | undefined { for (const key of keys) { if (has(this.data, key)) {