HostFunction.fromXdr constructor Null safety

HostFunction.fromXdr(
  1. XdrHostFunction xdr
)

Implementation

factory HostFunction.fromXdr(XdrHostFunction xdr) {
  XdrHostFunctionType type = xdr.args.type;
  switch (type) {
    // Account effects
    case XdrHostFunctionType.HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM:
      if (xdr.args.uploadContractWasm != null) {
        return UploadContractWasmHostFunction(
            xdr.args.uploadContractWasm!.code.dataValue,
            auth: ContractAuth.fromXdrList(xdr.auth));
      }
      break;
    case XdrHostFunctionType.HOST_FUNCTION_TYPE_INVOKE_CONTRACT:
      if (xdr.args.invokeContract != null) {
        List<XdrSCVal> invokeArgsList = xdr.args.invokeContract!;
        if (invokeArgsList.length < 2 ||
            invokeArgsList.elementAt(0).discriminant !=
                XdrSCValType.SCV_BYTES ||
            invokeArgsList.elementAt(0).bytes == null ||
            invokeArgsList.elementAt(1).discriminant !=
                XdrSCValType.SCV_SYMBOL ||
            invokeArgsList.elementAt(1).sym == null) {
          throw UnimplementedError();
        }
        String contractID =
            Util.bytesToHex(invokeArgsList.elementAt(0).bytes!.dataValue);
        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,
            auth: ContractAuth.fromXdrList(xdr.auth));
      }
      break;
    case XdrHostFunctionType.HOST_FUNCTION_TYPE_CREATE_CONTRACT:
      if (xdr.args.createContract != null) {
        if (xdr.args.createContract!.contractID.discriminant ==
            XdrContractIDType.CONTRACT_ID_FROM_SOURCE_ACCOUNT) {
          if (xdr.args.createContract!.executable.discriminant ==
                  XdrSCContractExecutableType
                      .SCCONTRACT_EXECUTABLE_WASM_REF &&
              xdr.args.createContract!.executable.wasmId != null) {
            String wasmId = Util.bytesToHex(
                xdr.args.createContract!.executable.wasmId!.hash);
            return CreateContractHostFunction(
                wasmId, salt: xdr.args.createContract!.contractID.salt!,
                auth: ContractAuth.fromXdrList(xdr.auth));
          } else if (xdr.args.createContract!.executable.discriminant ==
              XdrSCContractExecutableType.SCCONTRACT_EXECUTABLE_TOKEN) {
            return DeploySACWithSourceAccountHostFunction(
                salt: xdr.args.createContract!.contractID.salt!,
                auth: ContractAuth.fromXdrList(xdr.auth));
          }
        } else if (xdr.args.createContract!.contractID.discriminant ==
                XdrContractIDType.CONTRACT_ID_FROM_ASSET &&
            xdr.args.createContract!.executable.discriminant ==
                XdrSCContractExecutableType.SCCONTRACT_EXECUTABLE_TOKEN) {
          return DeploySACWithAssetHostFunction(
              Asset.fromXdr(xdr.args.createContract!.contractID.asset!),
              auth: ContractAuth.fromXdrList(xdr.auth));
        }
      }
      break;
  }
  throw UnimplementedError();
}