signHash method

Future<SafeSignature> signHash({
  1. required ETHAddress address,
  2. required EthereumSigner signer,
  3. required List<int> hash,
  4. SafeTransactionSigningMode? signingMode,
})

Implementation

Future<SafeSignature> signHash({
  required ETHAddress address,
  required EthereumSigner signer,
  required List<int> hash,
  SafeTransactionSigningMode? signingMode,
}) async {
  signingMode ??= switch (contract.version) {
    SafeContractVersion.v1_0_0 => SafeTransactionSigningMode.ethSign,
    _ => SafeTransactionSigningMode.signMessage,
  };
  switch (signingMode) {
    case SafeTransactionSigningMode.ethSign:
      final signature = await signer.signAsync(hash, hashMessage: false);
      return SafeSignature(address: address, signature: signature.toBytes());
    case SafeTransactionSigningMode.signMessage:
      final signature = await signer.signPersonalMessageAsync(hash);
      assert(
        signature.length ==
            CryptoSignerConst.ecdsaSignatureLength +
                CryptoSignerConst.ecdsaRecoveryIdLength,
      );
      final signatureBytes = signature.sublist(
        0,
        CryptoSignerConst.ecdsaSignatureLength,
      );
      int v = ETHSignatureUtils.getSignatureV(signature.last);
      return SafeSignature(
        address: address,
        signature: [...signatureBytes, v + 4],
      );
    case SafeTransactionSigningMode.approveHash:
      final signature = List<int>.filled(
        CryptoSignerConst.ecdsaSignatureLength +
            CryptoSignerConst.ecdsaRecoveryIdLength,
        0,
      );
      signature.setAll(
        0,
        ABIUtils.encode(types: ["address"], params: [address]),
      );
      signature.last = 1;
      return SafeSignature(address: address, signature: signature);
  }
}