import { UnichainTransaction } from '..'; import { AccountAddress } from '../wallet/Accounts'; import UnichainClient from '.'; import { Program, RawTransaction, TransactionArgument } from '../__generated__/transaction_pb'; /** * Internal class used by UnichainClient * to encode Unichain* classes exposed by library into pb classes used with rbc */ export class ClientEncoder { private readonly client: UnichainClient; constructor(client: UnichainClient) { this.client = client; } public async encodeUnichainTransaction( transaction: UnichainTransaction, senderAccountAddress: AccountAddress, ): Promise { let senderAddress = transaction.sendersAddress; if (senderAddress.isDefault()) { senderAddress = senderAccountAddress; } let sequenceNumber = transaction.sequenceNumber; if (sequenceNumber.isNegative()) { const senderAccountState = await this.client.getAccountState(senderAddress.toHex()); sequenceNumber = senderAccountState.sequenceNumber; } const program = new Program(); program.setCode(transaction.program.code); const transactionArguments = new Array(); transaction.program.arguments.forEach(argument => { const transactionArgument = new TransactionArgument(); transactionArgument.setType((argument.type as unknown) as TransactionArgument.ArgType); transactionArgument.setData(argument.value); transactionArguments.push(transactionArgument); }); program.setArgumentsList(transactionArguments); program.setModulesList(transaction.program.modules); const rawTransaction = new RawTransaction(); rawTransaction.setExpirationTime(transaction.expirationTime.toString(10)); rawTransaction.setGasUnitPrice(transaction.gasContraint.gasUnitPrice.toString(10)); rawTransaction.setMaxGasAmount(transaction.gasContraint.maxGasAmount.toString(10)); rawTransaction.setSequenceNumber(sequenceNumber.toString(10)); rawTransaction.setProgram(program); rawTransaction.setSenderAccount(senderAddress.toBytes()); return rawTransaction; } }