signHash method
Future<SafeSignature>
signHash({
- required ETHAddress address,
- required EthereumSigner signer,
- required List<
int> hash, - 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);
}
}