HostFunction.fromXdr constructor Null safety

HostFunction.fromXdr(
  1. XdrHostFunction xdr
)

Implementation

factory HostFunction.fromXdr(XdrHostFunction xdr) {
  XdrHostFunctionType type = xdr.type;
  switch (type) {
    // Account effects
    case XdrHostFunctionType.HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM:
      if (xdr.wasm != null) {
        return UploadContractWasmHostFunction(xdr.wasm!.dataValue);
      }
      break;
    case XdrHostFunctionType.HOST_FUNCTION_TYPE_INVOKE_CONTRACT:
      if (xdr.invokeContract != null) {
        List<XdrSCVal> invokeArgsList = xdr.invokeContract!;
        if (invokeArgsList.length < 2 ||
            invokeArgsList.elementAt(0).discriminant !=
                XdrSCValType.SCV_ADDRESS ||
            invokeArgsList.elementAt(0).address?.contractId == null ||
            invokeArgsList.elementAt(1).discriminant !=
                XdrSCValType.SCV_SYMBOL ||
            invokeArgsList.elementAt(1).sym == null) {
          throw UnimplementedError();
        }
        String contractID = Util.bytesToHex(
            invokeArgsList.elementAt(0).address!.contractId!.hash);
        String functionName = invokeArgsList.elementAt(1).sym!;
        List<XdrSCVal>? funcArgs;
        if (invokeArgsList.length > 2) {
          funcArgs = List<XdrSCVal>.empty(growable: true);
          for (int i = 2; i < invokeArgsList.length; i++) {
            funcArgs.add(invokeArgsList[i]);
          }
        }
        return InvokeContractHostFunction(contractID, functionName,
            arguments: funcArgs);
      }
      break;
    case XdrHostFunctionType.HOST_FUNCTION_TYPE_CREATE_CONTRACT:
      if (xdr.createContract != null) {
        if (xdr.createContract!.contractIDPreimage.type ==
            XdrContractIDPreimageType.CONTRACT_ID_PREIMAGE_FROM_ADDRESS) {
          if (xdr.createContract!.executable.type ==
                  XdrContractExecutableType.CONTRACT_EXECUTABLE_WASM &&
              xdr.createContract!.executable.wasmHash != null) {
            String wasmId = Util.bytesToHex(
                xdr.createContract!.executable.wasmHash!.hash);
            return CreateContractHostFunction(
                Address.fromXdr(
                    xdr.createContract!.contractIDPreimage.address!),
                wasmId,
                salt: xdr.createContract!.contractIDPreimage.salt!);
          } else if (xdr.createContract!.executable.type ==
              XdrContractExecutableType.CONTRACT_EXECUTABLE_TOKEN) {
            return DeploySACWithSourceAccountHostFunction(
                Address.fromXdr(
                    xdr.createContract!.contractIDPreimage.address!),
                salt: xdr.createContract!.contractIDPreimage.salt!);
          }
        } else if (xdr.createContract!.contractIDPreimage.type ==
                XdrContractIDPreimageType.CONTRACT_ID_PREIMAGE_FROM_ASSET &&
            xdr.createContract!.executable.type ==
                XdrContractExecutableType.CONTRACT_EXECUTABLE_TOKEN) {
          return DeploySACWithAssetHostFunction(Asset.fromXdr(
              xdr.createContract!.contractIDPreimage.fromAsset!));
        }
      }
      break;
  }
  throw UnimplementedError();
}