PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-icp/src/lib

Просмотр файла: signedTransactionBuilder.ts

import {
  CborUnsignedTransaction,
  RequestType,
  Signatures,
  UpdateEnvelope,
  RequestEnvelope,
  HttpCanisterUpdate,
} from './iface';
import utils from './utils';
import assert from 'assert';

export class SignedTransactionBuilder {
  protected _unsigned_transaction: string;
  protected _signaturePayload: Signatures[];

  constructor(unsigned_transaction: string, signatures: Signatures[]) {
    this._unsigned_transaction = unsigned_transaction;
    this._signaturePayload = signatures;
  }

  getSignTransaction(): string {
    const combineRequest = {
      signatures: this._signaturePayload,
      unsigned_transaction: this._unsigned_transaction,
    };
    const signatureMap = new Map();
    for (const sig of combineRequest.signatures) {
      signatureMap.set(sig.signing_payload.hex_bytes, sig);
    }
    const unsignedTransaction = utils.cborDecode(
      utils.blobFromHex(combineRequest.unsigned_transaction)
    ) as CborUnsignedTransaction;
    // at present we expect only one request type and one signature
    assert(combineRequest.signatures.length === 1);
    assert(unsignedTransaction.updates.length === 1);
    const envelopes = this.getEnvelopes(unsignedTransaction, signatureMap);
    const requestEnvelopeArray = envelopes[0] as [RequestEnvelope[]];
    const requestEnvelopes = requestEnvelopeArray[0] as RequestEnvelope[];
    assert(requestEnvelopes.length === 1);
    const requestEnvelope = requestEnvelopes[0] as RequestEnvelope;
    const signedTransaction = utils.cborEncode(requestEnvelope.update as UpdateEnvelope);
    return signedTransaction;
  }

  getEnvelopes(
    unsignedTransaction: CborUnsignedTransaction,
    signatureMap: Map<string, Signatures>
  ): [RequestEnvelope[]][] {
    const envelopes: [RequestEnvelope[]][] = [];
    for (const [, update] of unsignedTransaction.updates as unknown as [string, HttpCanisterUpdate][]) {
      const requestEnvelopes: RequestEnvelope[] = [];
      if (unsignedTransaction.ingress_expiries.length != 1) {
        throw new Error('ingress expiry can have only one entry');
      }
      const ingressExpiry = unsignedTransaction.ingress_expiries[0];
      update.ingress_expiry = ingressExpiry;

      const transactionSignature = utils.getTransactionSignature(signatureMap, update);
      if (!transactionSignature) {
        throw new Error('Transaction signature is invalid');
      }

      const pk_der = utils.getPublicKeyInDERFormat(transactionSignature.public_key.hex_bytes);
      const updateEnvelope: UpdateEnvelope = {
        content: { request_type: RequestType.CALL, ...update },
        sender_pubkey: pk_der,
        sender_sig: utils.blobFromHex(transactionSignature.hex_bytes),
      };

      requestEnvelopes.push({
        update: updateEnvelope,
      });

      envelopes.push([requestEnvelopes]);
    }
    return envelopes;
  }
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!