import { System, Protobuf, StringBytes } from "@koinos/sdk-as";
import { modsign } from "@veive-io/mod-sign-as";


import { IModSign as ModSign } from "@veive-io/mod-sign-as";


export class ModSignMnemonic extends ModSign {

  /**
   * Validates an ECDSA signature to ensure the authenticity of a transaction.
   * 
   * This method checks the length of the provided signature, recovers the public key from the signature
   * and transaction ID, and verifies that the recovered address matches the expected sender.
   * 
   * @external
   */
  is_valid_signature(args: modsign.is_valid_signature_args): modsign.is_valid_signature_result {
    const argsBuffer = Protobuf.encode(args, modsign.is_valid_signature_args.encode);
    const callRes = System.call(this._contractId, 0x4ab7a4bb, argsBuffer);
    if (callRes.code != 0) {
      const errorMessage = `failed to call 'ModSignMnemonic.is_valid_signature': ${callRes.res.error && callRes.res.error!.message ? callRes.res.error!.message : "unknown error"}`;
      System.exit(callRes.code, StringBytes.stringToBytes(errorMessage));
    }
    if (!callRes.res.object) return new modsign.is_valid_signature_result();
    return Protobuf.decode<modsign.is_valid_signature_result>(callRes.res.object, modsign.is_valid_signature_result.decode);
  }

  /**
   * @external
   * @readonly
   */
  manifest(): modsign.manifest {
    const argsBuffer = new Uint8Array(0);
    const callRes = System.call(this._contractId, 0x05b3abf2, argsBuffer);
    if (callRes.code != 0) {
      const errorMessage = `failed to call 'ModSignMnemonic.manifest': ${callRes.res.error && callRes.res.error!.message ? callRes.res.error!.message : "unknown error"}`;
      System.exit(callRes.code, StringBytes.stringToBytes(errorMessage));
    }
    if (!callRes.res.object) return new modsign.manifest();
    return Protobuf.decode<modsign.manifest>(callRes.res.object, modsign.manifest.decode);
  }
}
