sign method

void sign(
  1. KeyPair signer,
  2. Network network
)

Signs the authorization entry. The signature will be set to the soroban credentials

Implementation

void sign(KeyPair signer, Network network) {
  XdrSorobanCredentials xdrCredentials = credentials.toXdr();
  if (credentials.addressCredentials == null ||
      xdrCredentials.type !=
          XdrSorobanCredentialsType.SOROBAN_CREDENTIALS_ADDRESS ||
      xdrCredentials.address == null) {
    throw Exception("no soroban address credentials found");
  }

  XdrHashIDPreimageSorobanAuthorization authPreimageXdr =
      XdrHashIDPreimageSorobanAuthorization(
          XdrHash(network.networkId!),
          xdrCredentials.address!.nonce,
          xdrCredentials.address!.signatureExpirationLedger,
          rootInvocation.toXdr());
  XdrHashIDPreimage rootInvocationPreimage =
      XdrHashIDPreimage(XdrEnvelopeType.ENVELOPE_TYPE_SOROBAN_AUTHORIZATION);
  rootInvocationPreimage.sorobanAuthorization = authPreimageXdr;
  XdrDataOutputStream xdrOutputStream = XdrDataOutputStream();
  XdrHashIDPreimage.encode(xdrOutputStream, rootInvocationPreimage);
  Uint8List payload = Util.hash(Uint8List.fromList(xdrOutputStream.bytes));
  Uint8List signatureBytes = signer.sign(payload);
  AccountEd25519Signature signature =
      AccountEd25519Signature(signer.xdrPublicKey, signatureBytes);
  List<XdrSCVal> signatures = List<XdrSCVal>.empty(growable: true);
  if (credentials.addressCredentials!.signature.vec != null) {
    signatures.addAll(credentials.addressCredentials!.signature.vec!);
  }
  signatures.add(signature.toXdrSCVal());
  credentials.addressCredentials!.signature = XdrSCVal.forVec(signatures);
}